0

たとえば、クラスがあるMyClass場合、そのクラスのオブジェクトをインスタンス化するとき、これら2つの違いは何ですか。

Object obj=new MyClass();
MyClass obj2=new MyClass();

.NETでは、すべてのクラスがから派生していることを知っています。System.Objectそのため、この場合、obj変数とobj2変数にはオブジェクトへの参照が含まれているだけです。

しかし、違いはありますか?

もしそうなら、オブジェクトをインスタンス化するこれらの2つの方法を使用するとき、それは何ですか?

4

5 に答える 5

3

あなたのクラスに というプロパティがあるとするとName、これを使用すると、

Object obj = new MyClass();

そして使用しようとしました:

obj.Name = "George";

Object クラスにはプロパティがないため、これはコンパイラ エラーになりNameます。ただし、これは問題ありません。

MyClass obj2 = new MyClass();
obj2.Name = "George";

obj2ですMyClass。つまり、変数のクラス メンバー (プロパティ、メソッド、変数) にアクセスするには、その変数がそれらのメンバーを持つ型であるか、必要なクラスにキャストする必要があります。

((MyClass)obj).Name = "George";

ただし、メンバーを取得するために常に変数をキャストするのは良くありません。追加の CPU サイクルが必要になり、InvalidCastExceptions が発生する可能性があるためです。

于 2013-02-05T04:23:32.237 に答える
1

もちろん、クラスをオブジェクトとしてインスタンス化することはできますが、なぜでしょうか? それから何かを使用したい場合は、クラスとしてキャストする必要があります。

使用例DateTime

object obj = new DateTime();
int test = ((DateTime)obj).Second;   // Have to cast here, as object does not contain Second

DateTime obj2 = new DateTime();
int test2 = obj2.Second; // It is a DateTime so all good

var obj3 = new DateTime(); // Type is infered by right hand side assignment
int test3 = obj3.Second; // It is a DateTime so all good

したがって、オブジェクトとして作成するクラスに何もない場合を除き、オブジェクトを使用するだけでクラスを使用する理由はありません。

于 2013-02-05T04:26:23.283 に答える
0
public class MYclass
    {
        public int Id { get; set; }
    }


class Program
{
    static void Main(string[] args)
    {
        Object obj = new MYclass();
        MYclass mc = new MYclass();

        Console.WriteLine(obj.GetType());
        MYclass mc2 = obj as MYclass;
        Console.WriteLine(mc2.Id);
        Console.WriteLine(mc.Id);

        Console.ReadLine();
    }
}

上記のスニペットでは、出力は次のようになります

ConsoleApplication1.MYclass
0
0

これは、実行時に obj の型が Myclass であることを示しています。ただし、コンパイル時にはまだオブジェクトであり、obj 内の Myclass のプロパティにアクセスするには、明示的なキャストが必要です。

于 2013-02-05T04:25:14.767 に答える
0

MyClassから直接継承すると仮定するとObject、書き込みはオブジェクトObject obj = new MyClass()を作成しMyClassますが、それへの参照は 型Objectです。したがって、クラスに存在する公開されているメソッド、プロパティ、または状態変数は認識されませんMyClass

obj.MyClassMethod()

呼び出しは失敗します。利用可能なメソッドは、何らかの形式のキャストが使用されない限りobj、クラスによって公開されるメソッドのみです。Object

于 2013-02-05T04:25:59.773 に答える
0

最初に: 用語。MyClass のインスタンスを 1 つの方法でインスタンス化するだけです: そのコンストラクターを呼び出すことです。あなたがしていることは、2 つの方法でインスタンスを参照することです。これは、クラス インスタンスが実装されている任意の型から参照できるプロパティであるポリモーフィズムによるものです。作成したインスタンスを参照するさまざまな方法の間に大きな違いはありませんが、何らかの基本型を使用して何らかの操作を実行したい場合があります。CLR は、サブタイプ (MyClass) とその基本タイプ (Object) からの自動変換を実行します。

于 2013-02-05T04:27:27.660 に答える