创建类的实例

时间:2013-08-05 18:51:28

标签: c#

我即将开始学习C#并遇到zetcode C# tutorial(对于精彩教程网站或pdf的任何建议表示赞赏)。由于我之前使用Python进行了一些编程,我发现C#并不那么困难。但是,有一点让我感到困惑的是从网站上使用这样的东西。

using System;

public class Being {}

public class CSharpApp
{
    static void Main()
    {
        Being b = new Being();// I don't understand this
        Console.WriteLine(b);
    }
}

为什么不呢:

b=new Being ();

为什么网站在两个地方使用班级名称?这只是C#的方式还是它的一种写作方式?

8 个答案:

答案 0 :(得分:12)

好吧,你有2个部分。

第一部分是b

的声明
Being b;

这实际上告诉编译器您将使用名为Being

b类型的变量

第二部分是b

的分配
b = new Being();

为变量b分配一个对象,在本例中,该对象是Being类的新实例


c#允许您将两个部分合并为一行,从而产生以下结果:

Being b = new Being();

答案 1 :(得分:4)

第一个“存在”定义变量b类型。这表示“b是对Being类型的对象的引用”。您可以将其更改为var b = Being(),编译器将根据等号右侧的表达式推断B的类型。

第二个“存在”是表达式的一部分,该表达式提供变量b的初始。在这种情况下,它是对默认构造函数Being()的调用。您可以通过多种方式指定b的值:

Being b = null; // don't give it any value yet
Being b = new Being(); // make a new Being object using the default constructor
Being b = new Being("abcde"); // use a different custom constructor
Being b = GiveMeABeing(); // call some other method that will return a Being object

答案 2 :(得分:3)

变量声明中的第一个Being告诉编译器如何识别和处理对象。 new Being()告诉编译器如何构建(实例化)对象。当您利用接口和子类时,这类事情很有用。

abstract class IMusicalInstrument {
  public Play();
}

class Trumpet : IMusicalInstrument {
  public Play() {
    // etc.
  }
}

class Piano : IMusicalInstrument {
  public Play() {
    // etc.
  }
}

这样做,您可以利用返回未知IMusicalInstrument的方法:

IMusicalInstrument instrument = GetARandomInstrument();

..请放心,你可以Play()他们,尽管不知道完全他们是什么。

答案 3 :(得分:1)

第一行是定义一个类

public class Being {}

,第二个代码正在创建该类的实例。

Being b = new Being()

答案 4 :(得分:1)

为什么不呢:

b = new Being(); ?

我假设您了解=运算符,它将rhs分配给lhs。在上面的陈述中,您正在为b分配一些内容吗?

编译器如何知道b是什么?编译器不知道b是什么!所以你必须说bBeing类型的局部变量,这是以下代码所做的

Being b;

现在没有任何内容b你想在b中存储一些东西以便正确使用它?因此,创建type Being的实例并存储它。这就是以下代码所做的事情

b = new Being();

我们合并两者并告诉编译器b属于Being类型,它包含Being的新实例。

Being b = new Being();

希望这有帮助

答案 5 :(得分:0)

这就是C#的工作方式。您需要提供类的名称。如果你不喜欢这种语法 - 你也可以这样做:

var being = new Being();

答案 6 :(得分:0)

您必须声明类型然后实例化类型,因此在您的示例中,您将指定要声明Being然后实际创建(读取:new up)Being对象

至于你为什么需要指定它两次的问题,你的声明类型可能是一个基类,但你实例化一个派生类,如下所示:

public class Animal {}

public class Human : Animal {}

现在,在您的代码中,您可以声明Animal,但实际上会实例化Human,因为HumanAnimal,如下所示:

Animal myHuman = new Human();

答案 7 :(得分:0)

C#中的对象是在现实生活对象之后建模的。例如,球具有半径,弹性,重量,颜色等。您还可以对球执行操作,例如投掷,滚动,掉落,旋转等。在C#中,您将为此创建类似于此的类定义。球:

public class Ball
{
    // Radius in inches
    public double Radius { get; set; }
    public double Bounciness { get; set; }
    // Weight in lbs
    public double Weight { get; set; }
    public string Color { get; set; }
    // more properties

    // constructor - this is called when your class is instantiated (created)
    public Ball()
    {

    }

    // throw the ball
    public void Throw()
    {
        // method for throwing ball
    }

    // roll the ball
    public void Roll()
    {
        // method for rolling ball
    }

    // drop the ball
    public void Drop()
    {
        // method for dropping ball
    }

    // spin the ball
    public void Spin()
    {
        // method for spinning the ball
    }

    // more methods for interacting with a ball
}

然后你会声明一个Ball的实例,设置属性并调用这样的方法:

Ball ball = new Ball();
ball.Color = "Red";
ball.Weight = 1.2; // 1.2 lbs
ball.Radius = 12; // 12 inches
ball.Bounciness = 0.2; // for use in a physics engine perhaps
ball.Throw(); // throw the ball
ball.Drop(); // drop the ball
// etc