如何使用在堆栈中创建的类对象

时间:2013-08-09 06:02:31

标签: c#

我是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'

5 个答案:

答案 0 :(得分:5)

您无法指示编译器在C#中在堆栈上创建对象 - 您现在正在托管内存环境中工作,其中托管端的规则决定了哪里对象被创建。

最终在堆栈上的内容纯粹是一个实现细节。通常,它将是您的参考变量和任何本地value types 1 提供,由于lambdas而未提升这些变量和值类型,并且您没有在iteratorasync方法 2 中编写代码。

要创建任何reference type对象(class声明引用类型,structenum声明值类型),您必须使用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)

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

viku v = new viku();

甚至更短

var v = new viku();

您应该阅读有关构造函数的this article

答案 4 :(得分:0)

我对c#语法一无所知,但我认为它可能是

  

viku v = new viku();   v.func1();