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

C# 如何使用在堆栈中创建的类对象,c#,C#,我是c#的新手。所以我无法理解下面提到的概念 using System; namespace vivek { class viku { public void func1() { Console.WriteLine("Base"); } } class Behera { static void Main(String[] args) {

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

您需要实例化类的对象

改变


您需要实例化类的对象

改变

我不知道c#语法,但是。。我想可能是的

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

我不知道c语法,但是。。我想可能是的

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


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

viku v = new viku();
甚至更短

var v = new viku();

您应该阅读有关构造函数的内容

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

viku v = new viku();
甚至更短

var v = new viku();

您应该阅读有关构造函数的内容

您无法指示编译器在C#中的堆栈上创建对象-您现在在托管内存环境中工作,在托管内存环境中,事物的托管端具有决定对象创建位置的规则

堆栈上的结果纯粹是一个实现细节。通常,它将是您的引用变量和任何局部变量1,前提是这些变量和值类型没有因为而被提升,并且您没有使用or方法2编写代码

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


1正如我所说,本地值类型有时会出现在堆栈上,这是一个实现细节。但是有一个长期存在的神话,“值类型在堆栈上,引用类型在堆中”。您不应该将
更改为
结构
,而只是为了强制它进入堆栈(无论如何,它也不会总是这样)


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

您无法指示编译器在C#中的堆栈上创建对象-您现在在托管内存环境中工作,其中托管端具有决定对象创建位置的规则

堆栈上的结果纯粹是一个实现细节。通常,它将是您的引用变量和任何局部变量1,前提是这些变量和值类型没有因为而被提升,并且您没有使用or方法2编写代码

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


1本地值类型有时会最终出现在堆栈上,正如我所说的,这是一个实现细节。但是有一个长期存在的神话,“值类型在堆栈上,引用类型在堆中”。您不应该将
更改为
结构
,而只是为了强制它进入堆栈(无论如何,它也不会总是这样)


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/类。

< P>你似乎是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
类的任何实例;方法它不是一个像我们在C++中创建堆栈对象那样的对象吗?实际上,所有C#变量(除了int、double等值类型)都是引用,而不是对象。您必须创建引用的实例。这里没有基于堆栈的自动对象;方法它不是一个像我们在C++中创建堆栈对象那样的对象吗?实际上,所有C#变量(除了int、double等值类型)都是引用,而不是对象。您必须创建引用的实例。这里没有自动堆栈对象。在C++中,我们可以创建对象并调用上面提到的函数。在c#中有什么不同吗?我的问题是,在c#中,我们是否只能使用new创建对象?当您使用
new
时,将调用对象的构造函数。它初始化对象状态并分配内存。此外,在C++中,不能使用C++中未赋值的变量,我们可以创建对象并调用上面提到的函数。在c#中有什么不同吗?我的问题是,在c#中,我们是否只能使用new创建对象?当您使用
new
时,将调用对象的构造函数。它初始化对象状态并分配内存。同样,在C#中,不能使用未赋值变量。我不确定这是否正确。上面的程序(稍加修改,将
控制台::WriteLine
替换为
cout
等)在gcc中编译并运行!我猜想是因为C++没有1)在使用变量之前有一个编译器规则,2)在调用实例方法之前做一个“null”检查。code>func1
从不访问ins中的任何内存