1

我正要开始学习 C# 并遇到了zetcode C# 教程(对漂亮的教程网站或 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# 的方式还是它的一种编写方式?

4

8 回答 8

12

好吧,你有两个部分。

第一部分是声明b

Being b;

这基本上告诉编译器你将使用一个Being名称为类型的变量b


第二部分是任务b

b = new Being();

它为变量分配b一个对象,在这种情况下,它是Being类的一个新实例


c# 允许您将两个部分组合成 1 行,结果如下:

Being b = new Being();
于 2013-08-05T18:53:42.297 回答
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
于 2013-08-05T18:56:33.010 回答
3

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

abstract class IMusicalInstrument {
  public Play();
}

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

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

在这样做时,您可以利用返回 unknown 的方法IMusicalInstrument

IMusicalInstrument instrument = GetARandomInstrument();

Play()..尽管不确切知道它们是什么,但放心,您可以使用它们。

于 2013-08-05T18:58:08.377 回答
1

第一行是定义一个类

public class Being {}

第二个代码是创建该类的实例。

Being b = new Being()
于 2013-08-05T18:55:05.563 回答
1

为什么不只是:

b = new Being(); ?

我假设您了解=将 rhs 分配给 lhs 的运算符。在上面的陈述中,您正在分配b正确的东西?

编译器如何知道是什么b?编译器不知道是什么b!所以你不得不说这b是一个类型的局部变量,Being这就是下面的代码所做的

Being b;

现在什么都没有了b你想在 b 中存储一些东西以便使用它吗?所以创建一个实例type Being并存储它。这就是以下代码所做的

b = new Being();

我们将两者合并并告诉编译器b类型为 ,Being并且它拥有Being.

Being b = new Being();

希望这可以帮助

于 2013-08-05T19:12:13.503 回答
0

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

var being = new Being();
于 2013-08-05T18:53:36.207 回答
0

您必须声明类型,然后实例化类型,因此在您的示例中,您将指定要声明 aBeing然后实际创建(阅读:新建)一个Being对象。

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

public class Animal {}

public class Human : Animal {}

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

Animal myHuman = new Human();
于 2013-08-05T19:00:02.897 回答
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
于 2013-08-05T19:06:44.470 回答