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# 中的堆栈上创建对象 - 您现在在托管内存环境中工作,其中托管方面具有决定对象创建位置的规则。

最终在堆栈上的内容纯粹是一个实现细节。通常,它将是您的引用变量和任何本地值类型1前提是这些变量和值类型没有因为lambdas而被提升,并且您没有在迭代器异步方法中编写代码2

要创建任何引用类型对象(class声明引用类型structenum声明值类型),您必须使用new.


1正如我所说,局部值类型有时会出现在堆栈中这一事实是一个实现细节。但是有一个长期存在的神话,即“值类型在堆栈中,引用类型在堆中”。您不应该将您的更改class为 astruct只是为了强制它进入堆栈(无论如何它不会总是如此)。

2在所有这些情况下,编译器实际上会重新编写您编写的代码,而看起来像局部变量的东西实际上变成class了编译器为保存它们而构造的新字段。

于 2013-08-09T06:14:43.383 回答
2

您需要实例化类的对象。

改变

viku v;

viku v = new viku();
于 2013-08-09T06:04:51.773 回答
2

您似乎是一个 C++ 人,可以帮助您形象化的一件事(但这并不完全正确,它只是一个类比)是将 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 回答
1

要创建对象,您需要调用构造函数

viku v = new viku();

甚至更短

var v = new viku();

你应该阅读这篇关于构造函数的文章

于 2013-08-09T06:09:01.823 回答
0

我不知道 c# 语法但是..我认为它可能是

viku v=新的 viku(); v.func1();

于 2013-08-09T06:08:32.287 回答