1

私は c# が初めてです。したがって、以下の概念を理解することはできません。

using System;
namespace vivek
{
    class viku
    {
        public void func1()
        {
            Console.WriteLine("Base");
        }
    }
    class Behera
    {
        static void Main(String[] args)
        {
            viku v;
            v.func1();
        }
    }
}

コンパイル後、以下のエラーが表示されます

 error CS0165: Use of unassigned local variable 'v'
4

5 に答える 5

5

C# のスタック上にオブジェクトを作成するようにコンパイラに指示する方法はありません。現在、マネージ メモリ環境で作業しています。マネージ メモリ環境では、オブジェクトの作成場所を決定するルールがマネージ側に存在します。

最終的にスタックに残るのは、純粋に実装の詳細です。通常、これらの変数と値の型がlambdasによってホイストされておらず、イテレーターまたは非同期メソッドでコードを記述していない場合は、参照変数とローカル値の型1になります2

参照型オブジェクト (class参照型を宣言するstructenum、値型を宣言する)を作成するには、 を使用する必要がありますnew


1私が言うように、ローカル値型が時々スタックに置かれるという事実は、実装の詳細です。しかし、「値型はスタックに置かれ、参照型はヒープに置かれる」という根強い神話があります。class強制的にスタックに入れるためだけに a を変更するべきstructではありません (常にそうであるとは限りません)。

2これらすべての状況で、コンパイラは実際にユーザーが記述したコードを書き直し、ローカル変数のように見えるものは、実際にclassはコンパイラがそれらを保持するために構築する new のフィールドになります。

于 2013-08-09T06:14:43.383 に答える
2

あなたはC++の人のようですが、視覚化するのに役立つことの1つは(ただし、正確には真実ではなく、単なる類推です)、C#のクラスは常にC++のポインター参照であると考えることです。

したがって、元のコードを C++ の "同等" に書き直した場合 (メモリ リークは無視してください。これは単なる基本的な類推であり、正確な真実ではありません)。

namespace vivek
{
    class viku
    {
        public:
        void func1()
        {
            Console::WriteLine("Base");
        }
    }

    class Behera
    {
        static void Main(String[] args)
        {
            viku* v;
            v->func1();
        }
    }
}

これで (C++ を知っていると正しく仮定した場合) への呼び出しが機能しなかった理由は明らかです。クラスvのインスタンスを指していません。viku

于 2013-08-09T06:49:41.910 に答える
2

クラスのオブジェクトをインスタンス化する必要があります。

変化する

viku v;

viku v = new viku();
于 2013-08-09T06:04:51.773 に答える
0

私はC#の構文については考えていませんが..そうかもしれないと思います

viku v=新しい viku(); v.func1();

于 2013-08-09T06:08:32.287 に答える