[DotNet 開発転職]公众号では、ホストが.NET実戦面接問題を用意しました:
本記事の筆者はAIを活用して一部の詳細な回答を補足しました。これらの面接問題は、.NETフレームワーク、C#言語、ASP.NET、ADO.NET、データベースなど、.NET開発のさまざまな側面をカバーしています。対比学習を通じて、これらの知識ポイントをより深く理解し習得できます。
面接の過程では、これらの問題の理解と習得が非常に重要です。面接官はこれらの質問を通じて、受験者の.NET開発に対する理解と実践経験を評価します。したがって、これらの問題を学習することで、面接準備をより効果的に進め、競争力を高めることができます。
面接問題目次:
- CTS、CLS、CLRとは何か
- CLR技術とCOM技術の比較
- JITの動作方法
- アセンブリをGACに配置する方法
- 値型と参照型の違い
- C#におけるstringとStringの違い
- .NETにおけるスタックとヒープの特徴と差異
- .NETにおけるGCの動作メカニズム
- C#におけるオーバーライド、オーバーロード、隠蔽の概念
- C#で継承不可のクラスを宣言する方法
- Int[]は参照型か値型か
- ジェネリクスの基本原理
- Serializable属性の役割
- シリアル化と逆シリアル化のカスタマイズ方法
- IFormattableインターフェースを使用したフォーマット出力
- .NETが提供するタイマーの種類
- System.Objectで定義された3つの比較メソッドの共通点と相違点
- デリゲートの基本原理
- デリゲートによる静的メソッドとインスタンスメソッドのコールバックの違い
- チェーンデリゲートとは
- イベントの基本的な使用方法
- リフレクションの基本原理とその基盤
- リフレクションを使用したファクトリパターンの実装
- Type、Field、Method情報をメモリ消費を抑えて保存する方法
- スレッドとは
- .NETのスレッドプールの使用方法
- C#のlockキーワードの役割
- ASP.NETの実行形式の説明
- GETリクエストとPOSTリクエストの違い
- ASP.NETのページライフサイクル
- ページ遷移を実現するいくつかの方法
- SQLインジェクション攻撃の防止方法
- ADO.NETがサポートするデータソース
- データベースコネクションプールのメカニズム
- 接続文字列に含めることができる属性
- 厳密に型指定されたDataSetとは
- XMLとは
- XMLにおける名前空間の使用方法
- .NETでのXML文書の形式検証方法
- XSLTとは、XSLTの役割
- コード内でのXSLT文書の使用方法
- SOAPプロトコルの概要
- .NETでのWeb Serviceの作成方法
- Web Serviceプロキシ型の生成方法
- コネクションプール内の接続再利用率の向上方法
- ADO.NETがリレーショナルデータベースにアクセスする2つの方法
- リレーショナルデータベースと非リレーショナルデータベースとは
- Sessionの保存方法、違い、設定方法
- ViewStateの機能と実装メカニズム
- データベースの行から列、列から行への変換
- ADO.NETとORMの関係
1. CTS、CLS、CLR
CTS(共通型システム)は.NETにおける仕様であり、すべてのサポートされるデータ型と操作を定義し、異なる言語間の相互運用性を確保します。
CLS(共通言語仕様)はCTSのサブセットであり、異なる言語で書かれたコードが相互に呼び出せるようにするための最小限のルールと規約を定義します。
CLR(共通言語ランタイム)は.NETのコアコンポーネントであり、.NETコードを実行可能コードにコンパイルして実行し、メモリ管理、セキュリティ、例外処理などの機能を提供します。
詳細:面接必須:.NETにおけるCTS、CLS、CLRの説明
2. CLR技術とCOM技術の比較
CLR技術とCOM技術はどちらもコンポーネントベース開発のための技術ですが、いくつかの違いがあります。CLRはマネージドコード向けの技術であり、自動メモリ管理、型安全性、例外処理などを提供し、マルチ言語開発をサポートします。これにより、異なる言語で書かれたコードが統一された環境で実行できるようになります。
COMはアンマネージドコード向けの技術であり、コンポーネントベース開発の仕組みを提供しますが、メモリ管理と例外処理を手動で行う必要があり、C++およびCOM互換言語のみをサポートします。
COMは手動でのメモリ管理が必要ですが、CLRは自動ガベージコレクションを提供します。
CLRは強力なセキュリティとコードアクセス権限管理を提供しますが、COMのセキュリティは弱いです。
CLRは言語中立性を持ち、複数の言語をサポートしますが、COMはC++を好みます。
CLRはメタデータベースのアセンブリを使用しますが、COMはレジストリを使用してコンポーネントの登録と検索を行います。
3. JITの動作方法
JIT(Just-In-Time)はCLRの重要なコンポーネントであり、ILコード(中間言語)をネイティブマシンコードにコンパイルします。JITは実行時に必要に応じてILコードをマシンコードにコンパイルし、実行効率を向上させます。
これは.NETが実行可能プログラムを動作させる基本的な方法であり、つまり、実行が必要になった時点で、対応するILコードをネイティブ命令にコンパイルします。JITに入力されるのはILコードであり、出力はネイティブコードです。そのため、一部の暗号化ソフトウェアはJITにフックしてILを暗号化しつつ、プログラムの正常な動作を保証します。インタプリタ実行コードと比較して、JITの実行効率ははるかに高いです。
.NETプログラムが起動すると、ILコードは最初にCLRによってインタプリタ実行されます。しかし、実行効率を向上させるために、CLRはILコードをネイティブコードに逐次コンパイルし、キャッシュして後続の使用に備えます。
JITコンパイルは遅延コンパイルの一種であり、特定のILコードが実際に実行される必要がある場合にのみコンパイルが行われます。
JITには3つのモードがあります:
- プリコンパイルモード(Ngen):ILコードを事前にネイティブマシンコードにコンパイルします。
- 遅延コンパイルモード(JITコンパイラ):実行時にILコードをオンデマンドでコンパイルします。
- 混合モード:プリコンパイルと遅延コンパイルを同時に使用します。
4. アセンブリをGACに配置する方法
アセンブリをGAC(グローバルアセンブリキャッシュ)に配置することで、アセンブリのグローバル共有とバージョン管理を実現できます。わかりやすく言えば、.NETプラットフォームで使用するさまざまなdllを格納する場所です。
Gacutilツールを使用してアセンブリをGACにインストールできます(gacutil /i YourAssembly.dll)。また、アセンブリをGACディレクトリ(通常はC:\Windows\Assembly)に手動でコピーすることもできます。
または.NETコードを使用してインストールし、後でアンインストールすることもできます。
プログラム内でGAC内のアセンブリを参照する場合、完全なパスを指定せずにアセンブリ名を直接使用できます。
5. 値型と参照型の違い
値型と参照型は.NETにおける2つの基本的なデータ型です。
値型はスタック上に格納され、整数、浮動小数点数、文字などの単純型が含まれ、値が変数に直接格納されます。
参照型はヒープ上に格納され、クラス、インターフェース、デリゲートなどの複合型が含まれ、変数にはオブジェクトへの参照が格納され、参照自体はスタックまたはヒープ上のどこかに格納され、実際のオブジェクトはヒープ上にあります。
値型の代入は実際の値を新しい変数にコピーしますが、参照型の代入は参照をコピーし、同じオブジェクトを指します。
値型の受け渡しは値渡し、参照型の受け渡しは参照渡しです。
値型の代入は毎回フィールド単位のコピーが実行されますが、参照型の代入はポインタの受け渡しであり、実際には新しいポインタインスタンスが生成されます。
6. C#におけるstringとStringの違い
C#では、stringはC#のキーワードであり、.NETの文字列型を表します。
StringはSystem.Stringクラスの別名であり、つまりstringはStringのエイリアスであり、実質的な違いはありません。
Stringは.NET Frameworkからの古い名前です。C# 1.0で導入され、C# 2.0でstringに置き換えられました。実際の使用では、相互に変換可能であり、実質的な違いはありません。
7. .NETにおけるスタックとヒープの特徴と差異
.NETでは、ヒープとスタックは2つの異なるメモリ割り当て方式です。
ヒープは参照型のオブジェクトを格納するために使用され、ガベージコレクタがメモリの割り当てと解放を管理します。newやmallocなどのメモリ割り当て関数で割り当てられるのはヒープ上です。
スタックは値型の変数やメソッド呼び出しのコンテキスト情報を格納するために使用され、コンパイラが自動的にメモリの割り当てと解放を管理します。関数本体内で定義される変数は通常スタック上にあります。
ヒープの割り当て速度は遅いですが、動的にメモリを割り当てたり解放したりできます。ヒープは不連続なメモリ領域であり、ユーザーが自分で制御・解放します。ユーザーが解放しない場合、メモリが一定の閾値に達するとガベージコレクタ(GC)によって回収されます。
スタックの割り当て速度は速いですが、サイズは固定されており、ライフサイクルが短いです。スタックに格納される際には格納順序が管理され、LIFO(後入れ先出し)の原則が維持されます。スタックは連続したメモリ領域であり、システムによって自動的に割り当ておよび管理され、GCの管理は受けません。スタックのトップ要素が使用されるとすぐに解放されます。一方、ヒープはGCによるクリーンアップが必要です。参照型を使用する場合、通常はオブジェクト自体ではなくポインタに対する操作が行われます。しかし、値型はそのものに対する操作が行われます。
スタックのライフサイクルはメソッド呼び出しによって決まりますが、ヒープ上のオブジェクトのライフサイクルは長く、ガベージコレクタによって管理されます。
詳細:基礎面接必須:C#におけるスタックとヒープの違いと分析
8. .NETにおけるGCの動作メカニズム
GCはガベージコレクションの略であり、CLRの一部で、.NETコアメカニズムの重要な部分であり、自動メモリ管理の仕組みです。使用されなくなったオブジェクトを定期的にチェックし、その占有メモリを解放します。ガベージコレクタはオブジェクトの参照関係を追跡し、あるオブジェクトが参照されなくなると、そのオブジェクトをガベージオブジェクトとしてマークし、適切なタイミングで占有メモリを回収します。ガベージコレクタには、マークスイープ、コピー、マークコンパクトなどの異なるアルゴリズムと戦略があります。
基本的な動作原理は、マネージドヒープ内のオブジェクトを走査し、使用中のオブジェクト(使用されていないものはガベージ)をマークし、到達可能なオブジェクトを連続したアドレス空間に移動(圧縮)し、残りの不要なオブジェクトのメモリを回収することです。
9. オーバーライド、オーバーロード、隠蔽の概念
C#では、オーバーライド(override)とは派生クラスが基底クラスの仮想メソッドを再実装することです。
オーバーロード(overload)とは、同じクラス内で同名だがパラメータリストが異なるメソッドを複数定義し、必要に応じて多重定義することです。「オーバーライド」とは、サブクラスが基底クラスのメソッドを上書きすることを指します。サブクラスのオブジェクトから基底クラスのそのメソッドにアクセスできなくなります。
隠蔽(new)とは、サブクラスが基底クラスのメソッドを隠すことです。ただし、適切な変換を行うことでサブクラスのオブジェクトから基底クラスのメソッドにアクセスできます。サブクラスで宣言されたオブジェクトを使用すると隠蔽メソッドはサブクラスのものが呼び出され、基底クラスで宣言されたオブジェクトを使用すると基底クラスの隠蔽メソッドが呼び出されます。【参考:C#——隠蔽メソッド】
オーバーライドとオーバーロードはどちらもポリモーフィズムの表現形式ですが、隠蔽は基底クラスのメンバーを隠すことです。
詳細:面接必須:C#でポリモーフィズムを実現する際のoverloadとoverrideの違い
10. C#で継承不可のクラスを宣言する方法
C#では、sealedキーワードを使用してクラスを継承不可にできます。クラスがsealedとして宣言されると、他のクラスはそのクラスを継承できなくなります。
sealed class MySealedClass { }
11. int[]は参照型か値型か
int[]は参照型です。配列型は参照型であり、ヒープ上に格納されます。配列変数自体はスタック上に格納され、ヒープ上のデータを指します。
12. ジェネリクスの基本原理
ジェネリクスは.NETの機能であり、コンパイル時に型パラメータを指定することで、型安全性とコード再利用を実現します。基本原理は、コンパイル時の型チェックと型推論によって特定の型のコードを生成することです。実行時には、ジェネリクスコードは具体的な型にインスタンス化され、実行効率が向上します。
ジェネリクスを使用すると、異なるデータ型で動作するコードを、型ごとに異なるコードを書くことなく記述できます。
ジェネリクスを使用する際には、テンプレート(クラス、インターフェース、メソッドなど)を定義し、その中の一部の型を実際の使用時に指定できます。
13. Serializable属性の役割
Serializable属性は、クラスをシリアル化可能としてマークするために使用されます。つまり、オブジェクトをバイトストリームに変換して保存または転送できます。Serializable属性は、コンパイラとランタイム環境に対して、そのクラスのインスタンスがシリアル化および逆シリアル化可能であることを示します。
シリアル化はオブジェクトをバイトストリームに変換し、逆シリアル化はバイトストリームをオブジェクトに変換します。
14. シリアル化と逆シリアル化のカスタマイズ方法
シリアル化と逆シリアル化のカスタマイズは、ISerializableインターフェースを実装することで行えます。ISerializableインターフェースは2つのメソッドを定義します。GetObjectDataはオブジェクトのデータをバイトストリームにシリアル化するために使用され、CustomSerializableClassは逆シリアル化時に使用するコンストラクタを取得するためのものです。
[Serializable]
public class CustomSerializableClass : ISerializable
{
public string Name { get; set; }
public int Age { get; set; }
// ISerializableインターフェースの実装
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", Name);
info.AddValue("Age", Age);
}
// 逆シリアル化用コンストラクタ
protected CustomSerializableClass(SerializationInfo info, StreamingContext context)
{
Name = info.GetString("Name");
Age = info.GetInt32("Age");
}
}
15. IFormattableインターフェースを使用したフォーマット出力
IFormattableインターフェースを使用すると、フォーマット出力を実現できます。IFormattableインターフェースはToStringメソッドを定義し、このメソッドはフォーマット文字列とフォーマットプロバイダをパラメータとして受け取り、フォーマット文字列とフォーマットプロバイダの要件に従ってオブジェクトを文字列に変換します。
参考:IFormattable インターフェース (System) | Microsoft Learn
16. .NETが提供するタイマーの種類
.NETはいくつかのタイマー型を提供しています。System.Timers.Timer、System.Threading.Timer、System.Windows.Forms.Timerです。
System.Timers.Timer
これはイベントベースのタイマーであり、System.Timers名前空間にあります。System.Threading.Timerのラッパーであり、マルチスレッド環境により適しています。コールバックメソッドはデフォルトでタイマーを作成したスレッドで実行されます。単発または定期的なタスクスケジューリングをサポートします。
System.Threading.Timer
これはスレッドベースのタイマーであり、System.Threading名前空間にあります。指定された間隔でコールバックメソッドを実行し、単発または定期的なタスクスケジューリングが可能です。コールバックメソッドは別のスレッドで実行されるため、スレッド同期の問題に注意する必要があります。
System.Windows.Forms.Timer
これはWindowsフォームアプリケーション用のタイマーであり、System.Windows.Forms名前空間にあります。主にWindowsフォームアプリケーションでの定期的なUI更新のために使用され、コールバックメソッドはUIスレッドで実行されます。
System.Diagnostics.Stopwatch
これは高精度タイマーであり、System.Diagnostics名前空間にあります。典型的なタイマーではありませんが、コードセグメントの実行時間を測定するために使用され、パフォーマンス分析に役立ちます。
System.Threading.Tasks.Task.Delay
これは従来のタイマーではなく、Task.Delayメソッドによる非同期遅延です。一定時間待機してから非同期操作を実行できるため、遅延タスクの実装に使用できます。
詳細:C#3つのタイマー使用
17. System.Objectで定義された3つの比較メソッドの共通点と相違点
System.Objectには3つの比較メソッドが定義されています。Equals(object)、Equals(object, object)、ReferenceEquals(object, object)です。
これらのメソッドはすべて2つのオブジェクトが等しいかどうかを比較するために使用されます。しかし、比較方法が異なります。
Equals(object)メソッドは仮想メソッドであり、サブクラスでオーバーライドできます。2つのオブジェクトの値が等しいかどうかを比較します。
Equals(object, object)メソッドは静的メソッドであり、サブクラスでオーバーライドできません。2つのオブジェクトの参照が等しいかどうかを比較します。
ReferenceEquals(object, object)メソッドは静的メソッドであり、サブクラスでオーバーライドできません。2つのオブジェクトの参照が同じオブジェクトを指しているかどうかを比較します。
18. デリゲートの基本原理
C#のデリゲート(Delegate)は、CやC++の関数ポインタに似ています。デリゲートは、あるメソッドへの参照を保持する参照型変数であり、参照は実行時に変更できます。本質的にはクラスでもあり、メソッドの型を定義し、メソッドを別のメソッドのパラメータとして渡すことを可能にします。これは、メソッドを動的にパラメータに割り当てる手法です。
デリゲートは参照型であり、メソッドの呼び出しをカプセル化するために使用され、関数ポインタのようにメソッドをパラメータとして渡すことができます。デリゲートにはメソッドの参照とオプションのターゲットオブジェクトが含まれ、デリゲートを呼び出すと、実際にはデリゲートが参照するメソッドが呼び出されます。
デリゲートの基本原理は、デリゲートインスタンスを介してメソッドを呼び出すことです。デリゲートインスタンスには、メソッドの参照と呼び出しのコンテキスト情報が含まれています。
19. デリゲートによる静的メソッドとインスタンスメソッドのコールバックの違い
デリゲートで静的メソッドとインスタンスメソッドをコールバックする場合の違いは、呼び出し方法にあります。デリゲートが静的メソッドをコールバックする場合、クラス名を使用して静的メソッドを直接呼び出すことができます。インスタンスメソッドをコールバックする場合、まずインスタンスオブジェクトを作成し、そのインスタンスオブジェクトを使用してインスタンスメソッドを呼び出す必要があります。
// 疑似コード 参考用
// 静的メソッドのコールバック
Action<int> myAction = MyStaticMethod;
myAction(10);
// インスタンスメソッドのコールバック
MyClass myObject = new MyClass();
Action<MyClass> myAction2 = myObject.MyInstanceMethod;
myAction2(myObject);
20. チェーンデリゲートとは
チェーンデリゲートとは、複数のデリゲートオブジェクトを連結してデリゲートチェーンを形成することです。チェーンデリゲートを呼び出すと、各デリゲートオブジェクトが順に呼び出され、あるデリゲートがnull以外の値を返すか、すべてのデリゲートが呼び出されるまで続きます。チェーンデリゲートは、イベントハンドラチェーン、非同期操作チェーン、およびその他の複雑なタスクを実装するために使用できます。
C#では、+演算子を使用してデリゲートを連結できます。たとえば、次のコードは2つのデリゲートを連結します。
Action<int> myAction1 = (x) => Console.WriteLine(x);
Action<int> myAction2 = (x) => Console.WriteLine(x * x);
Action<int> myChainedAction = myAction1 + myAction2;
myChainedAction(10); // 出力:10 100
21. イベントとその基本的な使用方法
イベントはクラスのメンバーであり、クラスが特定の状況が発生したときに他のクラスやコードに通知できるようにします。
イベントを定義するには、delegateキーワードを使用してデリゲート型を宣言し、次にイベントメンバーを定義します。
+=演算子を使用してサブスクライバーのメソッドをイベントのデリゲートチェーンに追加します。イベントがトリガーされると、デリゲートチェーン内のメソッドが呼び出されます。
詳細:すべての.NET開発者が習得すべきC#デリゲートとイベントの知識
22. リフレクションの基本原理とその基盤
リフレクションは.NETのメカニズムであり、実行時に型の情報を取得および操作するために使用されます。
リフレクションは.NETプラットフォームの重要な機能であり、実行時にアセンブリ、型、メンバーなどの情報を取得および操作できます。
リフレクションの基本原理は、メタデータを使用して型の構造を記述し、ランタイムがこのメタデータにアクセスして型情報の詳細を取得できるようにすることです。
リフレクションの基盤はメタデータ(metadata)であり、これはアセンブリの一部であり、型、メンバー、メソッドなどの記述情報を含んでいます。これにより、プログラムは実行時に自身の構造と構成を理解できます。
23. リフレクションを使用したファクトリパターンの実装
まずファクトリパターンの実装方法を理解します。ファクトリパターンはクラスのインスタンス化を代替します。リフレクションを使用してファクトリパターンを実装すると、特定のクラス名や条件に基づいてオブジェクトのインスタンスを作成でき、各オブジェクトのインスタンス化(new)を明示的に指定する必要がなくなります。
using System;
// インターフェースの定義
public interface IVehicle
{
void Move();
}
// IVehicleインターフェースを実装する2つのクラス
public class Car : IVehicle
{
public void Move()
{
Console.WriteLine("Car is moving");
}
}
public class Bike : IVehicle
{
public void Move()
{
Console.WriteLine("Bike is moving");
}
}
// ファクトリクラス、リフレクションを使用してクラス名からオブジェクトインスタンスを作成
public class VehicleFactory
{
public IVehicle CreateInstance(string vehicleType)
{
Type type = Type.GetType(vehicleType); // 型を取得
if (type == null || !typeof(IVehicle).IsAssignableFrom(type))
{
throw new ArgumentException("無効な車両タイプ");
}
// インスタンスを作成
IVehicle vehicle = (IVehicle)Activator.CreateInstance(type);
return vehicle;
}
}
// main呼び出し
#region
// ファクトリクラスのインスタンス
VehicleFactory factory = new VehicleFactory();
// ファクトリを通じて異なるタイプのインスタンスを作成
IVehicle car = factory.CreateInstance("Car");
IVehicle bike = factory.CreateInstance("Bike");
car.Move(); // 出力:Car is moving
bike.Move(); // 出力:Bike is moving
#endregion
24. Type、Field、Method情報をメモリ消費を抑えて保存する方法
System.Reflection.EmitのDynamicMethodやDynamicTypeなどの軽量な構造を使用して、Type、Field、Methodの情報を保存し、少ないメモリオーバーヘッドで型や操作を作成します。
25. スレッドとは
スレッドはプログラム実行の最小単位であり、オペレーティングシステムがタスクスケジューリングを行う基本単位です。1つのプロセスに複数のスレッドを含めることができ、各スレッドは独自の実行パスと実行状態を持ちます。スレッドは並行して実行でき、プログラムの実行効率を向上させます。.NETでは、System.Threading名前空間がスレッドのサポートを提供しています。
26. .NETのスレッドプールの使用方法
スレッドプールを使用すると、スレッドを再利用してパフォーマンスを向上させ、スレッドの作成と破棄のオーバーヘッドを削減できます。ThreadPool.QueueUserWorkItemメソッドを使用してワークアイテムをスレッドプールにキューイングし、スレッドプール内のスレッドで実行できます。ThreadPoolクラスを使用して.NETのスレッドプールを使用できます。
static void Main()
{
// ワークアイテムをスレッドプールのキューに入れる
ThreadPool.QueueUserWorkItem(DoWork, "Hello ThreadPool!");
ThreadPool.QueueUserWorkItem(DoWork, "Hello ThreadPool2!");
// メインスレッドは他の作業を続行
Console.WriteLine("ご注目ください、公众号[dotnet开发跳槽].");
// コンソールがすぐに閉じないようにする
Console.ReadLine();
}
static void DoWork(object state)
{
// スレッドプール内のスレッドから実行される作業メソッド
string message = (string)state;
Console.WriteLine($"ThreadPool 作業: {message}");
}
27. C#のlockキーワードの役割
スレッドセーフは重要です。lockキーワードは、マルチスレッド環境での共有リソースへの安全なアクセスを確保するために使用されます。オブジェクトの相互排他ロックを取得してコードブロックを保護し、1つのスレッドだけがクリティカルセクションに入り、そのスレッドがロックを解放するまで他のスレッドは入れません。lockキーワードにより、同時に1つのスレッドだけがロックされたコードブロックにアクセスできるようになり、複数のスレッドが同時に共有リソースにアクセスしてデータの不整合が発生するのを防ぎます。
28. ASP.NETの実行形式の説明
ASP.NETはWebサーバー上で動作し、HTTPリクエストを処理しHTTPレスポンスを生成してWebサービスを提供します。ASP.NETはプロセス外またはプロセス内モードで実行できます。IISプロセスホストモードと自己ホストモードがあります。
ASP.NET Coreの場合は?
ASP.NET CoreもWebサーバー上で動作し、HTTPリクエストを処理しHTTPレスポンスを生成してWebサービスを提供します。従来のASP.NETとは異なり、ASP.NET Coreはクロスプラットフォームであり、Windows、Linux、macOSなどのオペレーティングシステムで実行できます。
ASP.NET Coreはプロセス外またはプロセス内モードで実行できます。プロセス外モードでは、ASP.NET Coreアプリケーションは独立したプロセスで動作し、HTTPプロトコルを介してWebサーバーと通信します。一般的なWebサーバーには、IIS、Nginx、Apacheなどがあります。
プロセス内モードでは、ASP.NET CoreアプリケーションはWebサーバーのプロセスに直接埋め込まれ、Webサーバーと同じプロセス空間を共有します。このモードでは、ASP.NET Coreアプリケーションはリクエストをより効率的に処理でき、プロセス間通信のオーバーヘッドが削減されます。
ASP.NET Coreは自己ホストモードもサポートしており、アプリケーションは任意のWebサーバーに依存せずに独立したコンソールアプリケーションとして実行できます。自己ホストモードでは、ASP.NET CoreアプリケーションはKestrelを組み込みのWebサーバーとして使用することも、他のサードパーティのWebサーバーを使用することもできます。
要約すると、ASP.NET Coreはプロセス外またはプロセス内モードで実行でき、自己ホストモードもサポートしています。具体的なニーズに応じて適切な実行方法を選択できます。
29. GETリクエストとPOSTリクエストの違い
GETリクエストとPOSTリクエストはHTTPプロトコルの2つの一般的なリクエストメソッドです。違いは主にデータ転送方法にあります。GETリクエストはリクエストパラメータをURLに追加して平文で転送し、データの取得に適しています。POSTリクエストはリクエストパラメータをリクエストボディに配置し、より安全で長さ制限がなく、データの送信に適しています。GETリクエストのパラメータには長さ制限があり、POSTリクエストのパラメータには長さ制限がありません。
HTTP GETリクエストのクエリパラメータの長さには制限があり、ブラウザによって制限が異なります。以下は一般的なブラウザのクエリパラメータ長制限です:
- Internet Explorer:Internet Explorer 9以下では、クエリパラメータ長の制限は2,083文字です。
- Microsoft Edge:Microsoft Edgeブラウザでは、クエリパラメータ長の制限は8,192文字です。
- Chrome:Chromeブラウザでは、クエリパラメータ長の制限は8,192文字です。
- Firefox:Firefoxブラウザでは、クエリパラメータ長の制限は65,536文字です。
- Safari:Safariブラウザでは、クエリパラメータ長の制限は80,000文字です。
これらの制限はクエリパラメータの長さに関するものであり、URLの他の部分(プロトコル、ドメイン名、パスなど)は含まれないことに注意してください。また、ブラウザのバージョンによって異なる場合があります。上記は参考値です。長いクエリパラメータを渡す必要がある場合は、POSTリクエストを使用するか、パラメータをリクエストボディに含めて転送することを検討してください。
30. ASP.NETのページライフサイクル
ASP.NETのページライフサイクルには、ページの初期化、ページの読み込み、ページの表示、イベント処理、ページのアンロードなど、複数の段階が含まれます。各段階でASP.NETは対応するイベント処理メソッドを呼び出し、開発者はこれらのメソッド内で独自のコードを記述して特定の機能を実装できます。
31. ページ遷移を実現するいくつかの方法
従来のMVCプロジェクトでは使用されますが、新しいプロジェクトでは一般的に読み取りと書き込みが分離されています。ページ遷移を実現する方法には、Response.Redirect、Server.Transfer、Server.Execute、ハイパーリンクやボタンコントロールのナビゲーション機能、JavaScriptのwindow.locationメソッドなどがあります。
32. SQLインジェクション攻撃の防止方法
現在は基本的にORMを使用するため、通常は発生しません。SQLインジェクション攻撃を防ぐには、パラメータ化クエリまたはストアドプロシージャを使用してデータベース操作を実行します。パラメータ化クエリは、ユーザー入力データをパラメータとしてデータベースに渡し、ユーザー入力データをSQL文に直接連結しません。入力データの検証とフィルタリングを行い、悪意のあるSQLコードの注入を防ぎます。ストアドプロシージャはSQL文をデータベースにカプセル化し、パラメータを介してユーザー入力データを渡すことができます。
33. ADO.NETがサポートするデータソース
ADO.NETが継続的に開発されるなら、サポートされるデータソースは無限です。ADO.NETはSQL Server、Oracle、OLEDB、ODBC、XMLなど、さまざまなデータソースをサポートしています。
34. データベースコネクションプールのメカニズム
データベースコネクションプールは、データベース接続を管理するためのメカニズムです。アプリケーションの起動時に一定数のデータベース接続を作成し、これらの接続をプール内に保持します。アプリケーションがデータベース接続を必要とするとき、プールから使用可能な接続を取得します。使用後は接続を閉じるのではなくプールに戻すことで、接続のオープンとクローズにかかる時間を削減し、接続の再利用率とパフォーマンスを向上させます。
35. 接続文字列に含めることができる属性
接続文字列には、データソース、ユーザー名、パスワード、接続タイムアウト時間など、複数の属性を含めることができます。一般的な接続文字列属性には、Data Source(データソース)、Initial Catalog(データベース名)、User ID(ユーザー名)、Password(パスワード)、Connect Timeout(接続タイムアウト)などがあり、接続先のデータベースとプロバイダによって異なります。
36. 厳密に型指定されたDataSetとは
厳密に型指定されたDataSetは、デザイン時にその構造が既知のDataSetです。Visual StudioのDataSet Designerを使用して作成され、コンパイル時の型チェックとIntelliSenseのサポートがあります。厳密に型指定されたDataSetでは、テーブルと列の型が明示的に指定され、汎用のObject型は使用されません。
37. XMLとは
XML(拡張可能マークアップ言語)は、データの保存と転送に使用されるマークアップ言語です。タグを使用してデータの構造と内容を記述し、自己記述性と拡張性の特徴があります。
38. XMLにおける名前空間の使用方法
XMLの名前空間は、要素や属性の名前の衝突を避けるために使用されます。xmlns属性を使用して名前空間を定義し、プレフィックスを使用して名前空間内の要素や属性を参照します。
39. .NETでのXML文書の形式検証方法
XML Schema Definition (XSD)ファイルを使用してXML文書を検証するか、XmlReaderクラスやXmlDocumentクラスを使用してXML文書の形式を検証できます。
XmlReaderクラスは、XML文書をストリーム方式で読み取り検証する方法を提供します。XmlReaderSettingsクラスのプロパティを設定して検証オプションを指定できます。
XmlDocumentクラスは、DOM方式でXML文書を読み取り検証する方法を提供します。XmlValidatingReaderクラスのプロパティを設定して検証オプションを指定できます。
40. XSLTとは、XSLTの役割
XSLT(拡張可能スタイルシート言語変換)は、XML文書を別のXML文書、HTMLページ、またはその他のテキスト形式に変換するために使用されます。XMLベースの変換言語です。XSLTはテンプレートとルールを定義することでXML文書を変換および処理でき、XML文書をHTML、PDFなどの形式に変換するためによく使用されます。
41. コード内でのXSLT文書の使用方法
.NET Frameworkのクラス(XslCompiledTransformやXmlDocumentなど)を使用してXSLT文書をロードし、その文書を適用してXMLデータを変換します。Transformメソッドを使用してXML文書を別の形式に変換します。
42. SOAPプロトコルの概要
SOAP(簡易オブジェクトアクセスプロトコル)は、構造化情報を交換するための通信プロトコルです。XML形式を使用してデータをカプセル化および転送し、ネットワークベースのサービス間の通信を可能にし、異なる環境や言語間の相互運用性をサポートします。
43. .NETでのWeb Serviceの作成方法
ASP.NETのWebServiceクラスを使用してWeb Serviceを作成できます。Web Serviceクラス内でパブリックメソッドを定義し、WebMethod属性でこれらのメソッドをマークすることで、HTTPリクエストを介して呼び出せるようにします。
44. Web Serviceプロキシ型の生成方法
wsdl.exeツールまたはVisual Studioの「サービス参照の追加」機能を使用して、Web Serviceプロキシ型を生成できます。wsdl.exeツールはWeb ServiceのWSDL文書からプロキシクラスを生成し、「サービス参照の追加」機能はWeb Serviceのメタデータからプロキシクラスを生成します。生成されたプロキシクラスは、Web Serviceのメソッドを呼び出すために使用できます。
45. コネクションプール内の接続再利用率を向上させる方法?
回答:以下の方法でコネクションプール内の接続再利用率を向上させることができます。
- 接続プールのパラメータを適切に設定する:アプリケーションのニーズに応じて、最大接続数、最小接続数、接続タイムアウトなどのパラメータを設定します。適切なパラメータ設定により、プール内での接続の過剰な作成と破棄を回避し、再利用率を向上させることができます。
- 接続プール内の接続の解放メカニズムを使用する:プール内の接続を使用する際には、接続リソースを迅速に解放することが重要です。usingステートメントを使用するか、接続のCloseメソッドを手動で呼び出して接続リソースを解放し、接続がプールに迅速に戻り、他のリクエストで再利用されるようにします。
- 長時間の接続占有を避ける:接続使用時には、接続の占有時間を最小限に抑えます。データベース操作の実行後は、できるだけ早く接続リソースを解放し、長時間の占有を避けて接続の可用性と再利用率を向上させます。
- 接続文字列の接続プール属性を使用する:接続文字列には、最大接続数や接続タイムアウトなどの接続プール関連の属性を設定できます。これらの属性を適切に設定することで、プール内の接続数とライフサイクルを制御し、再利用率を向上させることができます。
46. ADO.NETがリレーショナルデータベースにアクセスする2つの方法
回答:ADO.NETは2つのプロバイダを使用してリレーショナルデータベースにアクセスします。
- SQLClientプロバイダ:SQLClientプロバイダは、Microsoft SQL ServerデータベースにアクセスするためのADO.NETのプロバイダです。接続、SQL文の実行、結果の処理のためのクラスとメソッドを提供し、SQL Serverデータベースとの容易な対話を可能にします。
- OLEDBプロバイダ:OLEDBプロバイダは、汎用データアクセスインターフェースであり、さまざまな種類のリレーショナルデータベースにアクセスするために使用できます。接続、SQL文の実行、結果の処理のためのクラスとメソッドを提供し、アダプターパターンを使用して異なるデータベースに適応できます。
47. リレーショナルデータベースとは?非リレーショナルデータベースとは?
リレーショナルデータベースは、テーブルを使用してデータを整理・保存するデータベースです。リレーショナルモデルを使用してデータ間の関係を記述し、テーブルの行と列を使用してデータを保存・表現します。リレーショナルデータベースは、構造化クエリ言語(SQL)を使用してデータ操作とクエリを行います。
非リレーショナルデータベースは、リレーショナルモデルやSQLを使用しないデータベースです。異なるデータモデルとクエリ言語を使用してデータを保存・操作します。一般的な非リレーショナルデータベースには、ドキュメントデータベース、キーバリューデータベース、列指向データベースなどがあります。非リレーショナルデータベースは通常、大量の非構造化データの保存と処理に適しており、拡張性と柔軟性に優れています。
48. Sessionの保存方法、違い、設定方法
Sessionには以下の保存方法があります:
- サーバーメモリ:Sessionデータをサーバーのメモリに保存します。この方法はアクセス速度が速いですが、サーバーのメモリリソースを消費します。
- データベース:Sessionデータをデータベースに保存します。この方法はSessionの永続化が可能ですが、データベースへのアクセスオーバーヘッドが増加します。
- 外部サービス(Redisなど):SessionデータをRedisなどの外部キャッシュサービスに保存します。この方法はSessionの分散保存と共有が可能になり、システムのスケーラビリティとパフォーマンスが向上します。
Sessionの保存方法の設定は、構成ファイルまたはコードを使用して行えます。ASP.NETでは、Web.configファイルの<sessionState>要素を使用してSessionの保存方法とその他の属性を構成できます。mode属性を設定して保存方法(InProc、SQLServer、Redisなど)を指定し、対応する接続文字列やその他の構成情報を設定します。また、コードを使用してSessionの保存方法を設定することもできます。たとえば、SessionStateModuleのSessionStateModeプロパティを使用して保存方法を設定します。
49. ViewStateの機能と実装メカニズムの概要
ViewStateは、Webページのポストバック間でページコントロールの状態情報を保存するためのメカニズムです。ページコントロールのプロパティ値、イベント状態、ビューステートなどの情報を保存し、ページのポストバック時にページの状態を復元できます。
ViewStateの実装メカニズムは、ページコントロールの状態情報を__VIEWSTATEという名前の隠しフィールドに保存することです。ページがポストバックされると、ASP.NETが自動的に隠しフィールドの値を解析し、ページコントロールの状態を復元します。
ViewStateの機能は次のとおりです:
- ページコントロールのプロパティ値の保存:ViewStateはテキストボックスのテキスト、チェックボックスのチェック状態、ドロップダウンリストの選択項目など、ページコントロールのプロパティ値を保存できます。
- ページコントロールのイベント状態の保存:ViewStateはボタンのクリックイベント、チェックボックスの選択イベントなど、ページコントロールのイベント状態を保存できます。
- ページコントロールのビューステートの保存:ViewStateはページ上のコントロールの位置やスタイルなどのビューステートを保存できます。
ViewStateはページサイズを増加させ、ネットワーク転送のオーバーヘッドを増加させることに注意してください。ViewStateを使用する際には、サイズを制御し、過剰なデータ転送やページ読み込みの遅延を避けるように注意する必要があります。EnableViewStateプロパティを設定してViewStateを有効にするかどうかを制御し、ViewStateModeプロパティ(Enabled、Disabled、Inheritなど)を使用してViewStateのモードを制御できます。
50. データベースの行から列、列から行への変換
データベースの行から列への変換(Row to Column)とは、行データを列データに変換する操作です。通常、データベース内のデータは行形式で保存され、各行が1つのレコード、各列が1つのフィールドを表します。しかし、場合によっては行データを列データに変換してデータ分析やクエリをより便利に行いたいことがあります。これは、集計関数、PIVOT操作、またはカスタムクエリを使用して実現できます。
データベースの列から行への変換(Column to Row)とは、列データを行データに変換する操作です。行から列への変換とは逆に、列データをあるルールに従って行データに変換します。これは、UNPIVOT操作またはカスタムクエリを使用して実現できます。
51. ADO.NETとORMの関係
ADO.NET(ActiveX Data Objects .NET)とORM(オブジェクト関係マッピング)は、データベースにアクセスするための2つの技術であり、データベースアクセスの階層において一定の関係があります。
ADO.NETは、.NET Frameworkでデータベースにアクセスするためのクラスとメソッドのセットです。接続、コマンド、データリーダーに基づいてデータベースと対話する方法を提供します。ADO.NETは、SqlConnection、SqlCommand、SqlDataReaderなどの一連のクラスとメソッドを提供し、データベースへの接続、SQL文の実行、結果の処理を実現します。
ORMは、オブジェクトモデルとリレーショナルデータベースの間のマッピングを行う技術です。データベースのテーブルとレコードをオブジェクトとプロパティにマッピングし、開発者がオブジェクト指向の方法でデータベースを操作できるようにします。ORMフレームワークは、オブジェクトとデータベース間の変換を自動的に処理し、データアクセス層の開発作業を簡素化します。
ADO.NETとORMの関係は、ADO.NETが低レベルのデータベースアクセス技術であり、ORMがADO.NETの上に高レベルの抽象化とカプセル化を提供するものです。ORMフレームワークは、ADO.NETを低レベルのデータベースアクセス技術として使用し、オブジェクトとデータベースの関係をマッピングすることで、オブジェクトの永続化とデータベース操作の簡素化を実現します。
ORMフレームワークを使用すると、データベース操作をオブジェクトの操作に変換でき、開発者はビジネスロジックの実装に集中でき、低レベルのデータベースアクセスの詳細を気にする必要がなくなります。ORMフレームワークは、高い開発効率とコードの保守性を提供し、キャッシュや遅延ロードなどの追加機能を提供する場合もあります。ただし、ORMフレームワークはすべてのプロジェクトやシナリオに適しているわけではなく、複雑なデータベース操作にはADO.NETの低レベル機能を使用する必要がある場合もあります。
まとめ
本記事では、ネットユーザーから提供された.NET面接問題と各問題の参考回答を掲載しました。面接準備に役立ててください。上記の問題の一部は古いものであり、その会社の技術スタックがやや古いことを反映しています。面接のシナリオや質問の方向性は異なるため、状況に応じて適切に回答することをお勧めします。回答はあくまで参考です。面接でスムーズに対応するためには、基礎知識を絶えず向上させ、最新の技術動向を把握することが重要です。
文中の面接問題について異なる見解がある場合は、記事下にコメントするか、PRを提出してください: