我是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'
答案 0 :(得分:5)
您无法指示编译器在C#中在堆栈上创建对象 - 您现在正在托管内存环境中工作,其中托管端的规则决定了哪里对象被创建。
最终在堆栈上的内容纯粹是一个实现细节。通常,它将是您的参考变量和任何本地value types 1 ,提供,由于lambdas而未提升这些变量和值类型,并且您没有在iterator或async方法 2 中编写代码。
要创建任何reference type对象(class
声明引用类型,struct
或enum
声明值类型),您必须使用new
。
1 正如我所说,本地值类型有时最终出现在堆栈上的事实是一个实现细节。但是有一个持续的神话,即#34;值类型进入堆栈,引用类型进入堆中#34;。你不应该将你的class
更改为struct
只是为了强制它进入堆栈(无论如何它都不会是这样)。
2 在所有这些情况下,编译器实际上重写了您编写的代码,而实际上看起来像局部变量的字段是新的{{ 1}}编译器构造用于保存它们。
答案 1 :(得分:2)
您需要实例化类的对象。
更改
viku v;
到的
viku v = new viku();
答案 2 :(得分:2)
你似乎是一个C ++人,一个可以帮助你想象的东西(但它不完全正确,只是一个类比)是认为C#中的类总是在C ++中的指针引用。
因此,如果我们将您的原始代码重新编写为" equivilant"在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
类的任何实例。
答案 3 :(得分:1)
答案 4 :(得分:0)
我对c#语法一无所知,但我认为它可能是
viku v = new viku(); v.func1();