.NET のクラスが大きいか小さいかを判断するにはどうすればよいでしょうか。属性またはフィールドの数、属性/フィールドのデータ型、メソッドの戻り値の型、メソッドのパラメーター、メソッドのアクセス修飾子、仮想メソッドで測定されますか。よろしくお願いします。
class A
{
string x { get; set; }
}
class B
{
int x { get; set; }
}
この例では、クラスAとBを次のようにインスタンス化すると
A objA = new A();
B objB = new B();
クラス objA は String プロパティを保持し、objB は Int のみを保持するため、クラス objA の方が大きいのでしょうか? ただし、そのプロパティには値を設定していません。ありがとうございます
編集: 質問を明確にするために
授業があるとしよう
public class Member
{
public string MainEmpId { get; set; }
public string EmpId { get; set; }
}
そして別のクラス
public class User
{
public string AccessLevel { get; set; }
public string DateActivated { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Mi { get; set; }
public string Password { get; set; }
public string UserId { get; set; }
public string UserName { get; set; }
public string Active { get; set; }
public string ProviderName { get; set; }
public string ContactPerson { get; set; }
public string Relation { get; set; }
public string Landline { get; set; }
public string MobileNo { get; set; }
public string Complaint { get; set; }
public string Remarks { get; set; }
public string Reason { get; set; }
public string RoomType { get; set; }
}
これを次のようにインスタンス化すると
Member A = new Member();
User B = new User()
オブジェクト A はオブジェクト B より大きいですか? 奇妙な質問だとは思いますが、オブジェクトのインスタンス化ごとにメモリ領域が消費されると思います。
ベストアンサー1
クラス インスタンスのサイズは、次の要素によって決まります。
- インスタンスに実際に保存されるデータの量
- 値の間に必要なパディング
- メモリ管理で使用される追加の内部データ
したがって、通常、文字列プロパティを含むクラスには次のものが必要です (32 ビット システムの場合)。
- 内部データ用8バイト
- 文字列参照用の4バイト
- 未使用のスペース 4 バイト (メモリ マネージャーが処理できる最小の 16 バイトに達するため)
通常、整数プロパティを含むクラスには次のものが必要です。
- 内部データ用8バイト
- 整数値の場合は4バイト
- 未使用のスペース 4 バイト (メモリ マネージャーが処理できる最小の 16 バイトに達するため)
ご覧のとおり、文字列プロパティと整数プロパティはクラス内で同じスペースを占有するため、最初の例では同じ量のメモリを使用します。
文字列プロパティの値は、ヒープ上の文字列オブジェクトを指している可能性があるため、もちろん別の問題ですが、それは別のオブジェクトであり、それを指すクラスの一部ではありません。
より複雑なクラスでは、パディングが役立ちます。ブール値と文字列のプロパティを含むクラスでは、たとえば次のように使用します。
- 内部データ用8バイト
- ブール値用の1バイト
- 4バイト境界に合わせるために3バイトのパディングを行う
- 文字列参照用の4バイト
これらはクラスのメモリ レイアウトの例であることに注意してください。正確なレイアウトは、フレームワークのバージョン、CLR の実装、および 32 ビット アプリケーションか 64 ビット アプリケーションかによって異なります。プログラムは 32 ビット システムでも 64 ビット システムでも実行できるため、メモリ レイアウトはコンパイラにも認識されず、実行前にコードが JIT されるときに決定されます。