C# 初始化类的意义?

C# 初始化类的意义?,c#,object,C#,Object,我正在读一本关于C#初学者的书,我正在读“理解价值观和参考文献”部分,但有些东西我不懂。我看到的是,这些书试图向我解释(我在Youtube上的几个教程视频中也看到了这种情况),这个类被用来创建一个类的对象(?)。我已经阅读了上一章中发生的事情,我不太理解它,假设它会在下一章中变得更清楚。它并没有变得更清晰,所以我认为在我理解之前我解释的东西的概念之前继续下去不是一个好主意 以下部分是本书的一部分: 请记住,要初始化引用变量(如类),需要 可以创建类的新实例并分配引用 新对象的变量,如下所示: L

我正在读一本关于C#初学者的书,我正在读“理解价值观和参考文献”部分,但有些东西我不懂。我看到的是,这些书试图向我解释(我在Youtube上的几个教程视频中也看到了这种情况),这个类被用来创建一个类的对象(?)。我已经阅读了上一章中发生的事情,我不太理解它,假设它会在下一章中变得更清楚。它并没有变得更清晰,所以我认为在我理解之前我解释的东西的概念之前继续下去不是一个好主意

以下部分是本书的一部分:


请记住,要初始化引用变量(如类),需要 可以创建类的新实例并分配引用 新对象的变量,如下所示:

Label label1 = new Label();
SetLabelText(label1);

我可以用这个例子中的代码做什么?为什么它很方便?示例+解释将非常受欢迎。提前谢谢

好吧,它可能很方便,但不一定总是有可能为您的类型引用指定一个新对象的位置。在这种情况下,在最后一行
copy=c
,您说copy now指向
c
之前分配的内存位置,换句话说,在该行之后,它们都指向相同的内存位置

听上去,你还没有完全理解书中所解释的:

下面的内容是制作两个大小分别为3和4的圆圈,并复制第一个圆圈,然后制作成5。。除非你把它打印出来,它不是这样工作的

class Program
{
    static void Main(string[] args)
    {

        circle a = new circle(3);
        circle b = new circle(4);
        circle d = a;
        d.Diameter = 5;

        Console.WriteLine("a is {0}", a.Diameter); // shows 5
        Console.WriteLine("b is {0}", b.Diameter); // shows 4
        Console.WriteLine("d is {0}", d.Diameter); // shows 5
    }
}

class circle
{
    public int Diameter;
    public circle(int d)
    {
        Diameter = d;
    }
}

因为你没有给d画一个新的圆圈,实际上d是a的别名,所以,就像某人的名字叫彼得一样,他也可以叫皮特。

如果我们在这个上下文中指人,那么类定义了什么是人以及它可以做什么(它的成员如高度、宽度等,以及它的方法eat()、drink()等等)一个对象代表实际的人类(一个叫Andrew的人,他的身高和宽度可以吃喝)

记住,要初始化一个引用变量,比如一个类,你可以创建一个类的新实例,并将引用变量分配给新的对象

他展示了引用类型和值类型之间的差异。对于值类型,它已初始化

double-d

你不必再做什么了。对于类或引用类型,必须为其提供对象的实例

圈c尚未为其指定对象

d=c.Radius
错误。不指向对象的引用。内存访问冲突


圆圈c=新圆圈()现在可以了。

如果我错了,请纠正我,但是当我查看代码时,我看到两个对象正在创建,指向一个值是它们自己的内存位置


副本=c;行只是说复制对象不会指向c对象的内存位置,而不是它第一次设置的位置。

我将尝试修复该引号,因为这太糟糕了

原件:


请记住,要初始化引用变量(如类),可以创建该类的新实例并将引用变量分配给新对象,如下所示:

Label label1 = new Label();
SetLabelText(label1);
固定的:


请记住,要初始化引用类型的变量,可以创建该变量类型的新实例,并将该变量更改为指向新对象,如下所示:

Label label1 = new Label();
SetLabelText(label1);
虽然你应该记住这一点,但我不知道。是的,您可以创建对同一对象的多个引用,这本身就很有用,但我并不认为这是一种特别有用的初始化策略

修正得更好:

您可以使引用类型的变量引用同一实例,但请记住,变量本身不是别名,因此覆盖其中一个不会更改另一个


您可以将类视为数据的模式,如规范或蓝图。当你使用“new”关键字时,你是在告诉计算机使用该蓝图为你制作一个对象。对象是该类的具体实例

因此,如果您有一个蓝图(类定义),您可以调用new任意多次,以生成该类的任意多个实例。同样的方法,如果你有一辆汽车的蓝图,你可以根据你的需要(给定足够的材料)复制任意多的汽车

这样做:

Circle c = new Circle(42);
Circle copy = new Circle(99);
告诉计算机使用圆类定义并实例两个对象(因此计算机内存中存在两个圆)。这些是具有不同特性的不同对象(一个具有半径42,另一个具有半径99)。它们被分配到变量c和copy中


代码的最后一行,在那里复制=c;将变量c指向的圆圈放入变量副本中。

在您提供的示例中,与书籍提供的许多示例一样,您看到的是最基本的情况。在您真正深入了解代码之前,很难理解使用这种特性的最佳方式

我不知道这是否完全正确,但我使用这种方式是:

private double GetArea(Circle c)
{
     //this will be a default circle should the passed in circle be invalid
     Circle toCalc = new Circle(5);

     //check to make sure c is valid
     if(c != null)
          toCalc = c;

     return Math.pow(toCalc.Radius, 2) * Math.Pi;
}

由于toCalc是一个类而不是一个原始数据类型,因此必须对其进行初始化才能编译代码。如果未初始化,编译器将给您一些错误,如“toCalc可能未初始化”。

类定义是蓝图。把它想象成一座房子。每次你实例化一个对象
Circle c=new Circle(42)
你就是在用这个蓝图建造一座房子。每栋房子在街上都有一个地址(记忆中的地址)

你拥有的每一个变量都像一张纸,上面列出了房子的地址。所以你在主街123号建了一栋两层楼的蓝色房子
Label label1 = new Label();
Label label2 = new Label();
label1.Text = "1";
label2.Text = "2";
void SetLabelText(Label labelToSet)
{
    labelToSet.Text = "text";
}
Label label1 = new Label();
SetLabelText(label1);
Label label1; 
label1.Text = "1";  // Throws a null reference exception
int x;
int y;
x = 1;
y = x;
y = 2;
class House {

// ...
}
House house = new House();
House house;
house = new House();
int i = 4;