web-dev-qa-db-ja.com

オブジェクト、動的、および変数の違い

これら3つのキーワードObjectDynamicおよびvarの違いをC#で知る必要があります。

私はこれを見ました link しかし、私はそれぞれのケースを使用しなければならない場合に理解していません。

これらのキーワードの違いを教えてください。各キーワードのユーティリティは何ですか?

34
Lamloumi Afif

すべてがObjectです。これは基本型です。すべての型はObjectをすぐに継承し、単純なint変数はobjectにボクシングできます。例えば:

object a = 10; // int
object b = new Customer(); // customer object
object c = new Product(); // product object
object d = "Jon"; // string
object e = new { Name = "Felipe", Age = 20 }; // anonymous type

これは、あらゆるタイプの最も抽象的であり、参照タイプです。実際の型を取得する場合は、unboxにする必要があります(メソッド、キャストなどの会話戦略を使用)。

object a = "Some Text";
string text = a.ToString();

// call a string method
text = text.ToUpper();

object i = 10; // declared as object but instance of int
int intValue = (int) i; //declare as an int ... typed

DynamicはC#の動的な側面の実装であり、強く型付けされていません。例えば:

dynamic a = new Class();
a.Age = 18;
a.Name = "Jon";
a.Product = new Product();

a.Name; // read a string
a.Age; // read an int
a.Product.Name; // read a property
a.Product.MoveStock(-1); // call a method from Product property.

varはC#言語の単なるキーワードであり、値で初期化するため、型のオブジェクトを定義できます。たとえば、この値から型を決定します。

var a = 10; // int
var b = 10d; // double
var c = "text"; // string
var p = new Product(); // Product type

コンパイラは、定義した値の型をチェックし、オブジェクトに設定します。

30
Felipe Oriani

オブジェクト:

C#の各オブジェクトは、直接または間接的にオブジェクトタイプから派生します。コンパイル時の変数であり、変換にはボックス化とボックス化解除が必要であり、速度が遅くなります。値の型を参照型に、またはその逆に変更できます。

public void CheckObject()
{
    object test = 10;
    test = test + 10;    // Compile time error
    test = "hello";      // No error, Boxing happens here
}

Var:

コンパイル時変数であり、ボックス化およびボックス化解除は必要ありません。 Varはコンパイル時の機能であるため、すべての型チェックはコンパイル時にのみ実行されます。 Varが初期化されると、格納されている型を変更することはできません。

public void CheckVar()
{
    var test = 10;         // after this line test has become of integer type
    test = test + 10;      // No error
    test = "hello";        // Compile time error as test is an integer type
}

動的:

ランタイム変数であり、ボックス化およびボックス化解除は必要ありません。ダイナミックに割り当てて値を設定したり、ダイナミックに保存されている値のタイプを変更したりできます。ダイナミックに関するすべてのエラーは、実行時にのみ発見できます。ダイナミックは、あらゆるタイプのデータを保持できるランタイムオブジェクトであるとも言えます。

public void CheckDynamic()
{
    dynamic test = 10;
    test = test + 10;     // No error
    test = "hello";       // No error, neither compile time nor run time
}
45
Love Gupta

1) var は暗黙的な型定義に使用されます。たとえば、次のような変数を定義する場合:

var number = 123;

コンパイラは、割り当てられた値とcompile timeで整数として初期化された変数に基づいて型を推測します。この定義の後は、変数が整数であるため、stringを変数に割り当てることはできません。また、次のようにvarを使用することはできません。

var number;
number = 123;

タイプを判別できるようにvarキーワードを使用している場合は、変数に何かを割り当てる必要があるためです。

2)Objectは、すべてのクラスの基本クラスです。 C#すべてのクラスはオブジェクトクラスを継承するため、すべてをオブジェクトに割り当てることができます。例:

object str = "bla bla bla..."; 
str = 234;
str = DateTime.Now;

これは、これを行うと boxing/unboxing が自動的に実行されるため機能しています。 varキーワードとは対照的に、次のようにobjectを使用できます。

object myVariable;
myVariable = "bla bla bla..";

3)dynamicは、C# 4.0、コンパイル時に関数から返される型がわからない場合は、dynamicを使用できます。あなたの型はrun-time。したがって、動的変数でインテリセンスを使用することはできません。

次のようにダイナミックを使用できます。

dynamic myObj = SomeMethod();
myObj.DoSomething();
myObj.Method1();

ただし、dynamicを使用する場合は注意が必要です。存在しないメソッドまたはプロパティを呼び出すと、実行時にRuntimeBinderExceptionが取得されるためです。

最後に、dynamicobjectはパラメーター型にすることができますが、varはできません。たとえば、これを行うことができます:

public void SomeMethod(dynamic arg1)

しかし、これはできません。

public void SomeMethod(var arg1)

varは型ではなく、コンパイラが型を推測できるようにするための構文糖衣です。

13
Selman Genç

Objectは、すべての.netオブジェクトの派生元のルートクラスです。

varは、たとえば_string x = "a"_と書きたくないが、代わりに_var x = "a"_と書きたい場合のショートカットとして使用されます。コンパイラが意味を理解できる場合にのみ機能します。

dynamicは、オブジェクトの操作が実行時にのみ評価されることを意味します(メソッドが存在しない場合でも、x.StrangeMethod()はコンパイルエラーを引き起こしません)。

7
Dani J

とても簡単です…

Objectは.NETの基本型です。他のタイプはすべてそれから継承されます。したがって、オブジェクト型の変数にはすべてを含めることができます。ただし、次の理由により、他のオプションはありません。

  1. この変数の読み取り/書き込みの前に、アンボックス化/ボックス化操作を行う必要がありますが、これは高価です。

  2. コンパイラはコンパイル時に型チェックを実行できず、実行時にバグや例外が発生する可能性があります。たとえば、このコードは正常にコンパイルされますが、実行時に例外をスローします。

    object o = "2"; 
    int i = 1 + (int)o;
    

Varは型ではありませんが、プログラムコンテキストから変数の型を決定するコンパイラーの命令です。匿名メソッドに必要でしたが、どこでも使用できます。プログラムが読みにくくならないように注意してください。コンパイラはコンパイル時に決定を行うため、プログラムの効率には影響しません。

動的 –は、コンパイラがコンパイル時に型チェックを行わない特別な型です。タイプは、実行時にCLRによって指定されます。これは静的(!)タイプであり、変数タイプが指定された後は、後で変更できません。このタイプは、オブジェクトタイプと同様の理由で他のオプションがない場合にのみ使用する必要があります。

  1. 実行時にタイプを指定する追加操作があります。これにより、プログラムの効率が低下します。

  2. コンパイラは、実行時にバグや例外が発生する可能性のある型チェックを実行しません。

7
Lebedev Alexei

System.Object、dynamicおよびvarの違いは次のとおりです。

.netのすべてはSystem.Object型から派生しています。しかし、特定の違いを探しているなら、ここにあります。

オブジェクトと動的の違い。

1.Object型の変数を暗黙的に他の型にキャストすることはできません。コンパイラはそれを許可しません。一方、暗黙的に任意の型を動的にキャストできます。実行時にキャストが実行され、必要に応じて実行時に例外が発生するため、コンパイラは文句を言いません。 2. dynamicはオブジェクトと同じであるため、Objectとdynamicの引数が異なるオーバーロードメソッドを記述することはできません。

動的と変数の違い。

1.ローカル変数をdynamicまたはvarとして宣言する場合、構文上の違いのみがあります。 2.初期化せずにvar型の変数を宣言することはできませんが、動的変数に対してはそれを行うことができます。 4.式をvarにキャストすることはできませんが、ダイナミック変数に対してはできます。

4
jewel jose

Object、Var、およびDynamicタイプの違いの要約。各テーブル行のセルの概念が理解できない場合は、別の場所で参照してください。ソース: https://www.dotnettricks.com/learn/csharp/differences-between-object-var-and-dynamic-type

Image showing the comparison among Object, Var and Dynamic

3
Hedego

オブジェクト

.netのベースオブジェクト。ほとんどの場合、使用する必要はありません。

Var

単なる構文糖、varを使用するときはいつでも、変数の型はそれに割り当てられた値に従ってコンパイル時に決定されます。

動的

.netのDLR部分に由来するため、非厳密な型指定を使用する場合にのみ必要になります。

3
Clueless

コンパイラによると、varは変数宣言に使用されるコンテキストキーワードです。そのため、宣言時に値を割り当てる必要があります。その後、コンパイラはデータ型をチェックし、同じ方法で処理します。このようにして、コンパイラはその変数に関するすべてを認識し、その変数の型の安全性を暗示します。

1
Vikas Thombre