【问题标题】:Why can't I set the property value of a class object without being in a method?为什么我不能在没有方法的情况下设置类对象的属性值?
【发布时间】:2012-11-02 15:21:11
【问题描述】:

我在设置属性时遇到问题,并意识到我只能在函数或方法中设置属性。我的问题是为什么会这样?

这是我的有效代码:

public class SomeClass
{    
    Car car = new Car();

    public Car JustAMethod()
    {
        Car car = new Car();
        car.year = 2012;

        return car;
    }        
}

为什么这不起作用:

public class SomeClass
{        
    Car car = new Car();
    car.year = 2012;//I get an error here
}

【问题讨论】:

  • 这就是构造函数的用途;)
  • 构造函数正在成为一种被遗忘的艺术。我有时希望对象初始化器永远不会发生。使用构造函数,您可以准确地告诉使用代码创建有效对象所需的内容。使用初始化器,客户端代码可以以任何它想要的方式 hork 对象。
  • @BobHorn 我认为构造函数和对象初始值设定项都有其有效用途。构造函数应该需要构造有效对象所需的所有信息;对象初始化器可用于提供选项信息。

标签: c# function object


【解决方案1】:

语言规范(大部分)禁止在类级别执行任意语句。可以做的就是为类的静态或实例成员指定默认值。

一般来说,所有代码都必须在类的方法中执行。

As AntLaC mentioned,您可以通过使用对象初始化语法指定值来解决此问题。由于可以在类级别定义对象(作为“静态或实例成员的默认值”),因此使用如下语法也可以:

public class SomeClass
{
    Car car = new Car() {
        year = 2012;
    };
}

【讨论】:

    【解决方案2】:

    因为这是语言规范要求的方式。

    想象一下,如果可以在任何你喜欢的地方写任何东西,将会发生什么混乱: 我们最终会使用 PHP,而这肯定不是 C# 的设计目标。

    【讨论】:

      【解决方案3】:

      如果你想设置特定的属性,你可以在没有方法的情况下尝试这个

      Car car = new Car()
                {
                   year = 2012
                };
      

      【讨论】:

      • 这并没有解决任意代码根本无法在类级别执行,而必须在方法中的问题。 (可以设置静态和非静态类变量,仅此而已。)这有多重要取决于提问者真正问的是什么,这有点不清楚。 (不反对,只是想提一下。)
      • @PlatinumAzure 并非每个答案都必须解决问题的每个可能方面。这恰好是我认为最有用的方法之一。
      • 我完全同意,事实上我什至给你一个赞成票。我试图通过将其与不同的问题进行对比来增强答案:-)
      • 我同意@PlatinumAzure。这并没有回答“为什么只能在函数或方法中设置属性”的问题。该语言提供语法糖以使其看起来确实允许在方法之外设置属性这一事实与imo无关。
      【解决方案4】:

      简单的答案是这些只是语言的规则。但是,您有几个选择:

      创建一个构造函数,让 Car 耗时一年:

      public class SomeClass
      {        
          Car car = new Car(2012);
      }
      

      使用对象初始化器:

      public class SomeClass
      {        
          Car car = new Car() { Year = 2012 };
      }
      
      Use a method:
      
      public class SomeClass
      {        
          Car car = InitializeCar(2012);
      
          private Car InitializeCar(int year)
          {
              Car car = new Car();
              car.Year = 2012;
      
              return car;
          }
      }    
      

      【讨论】:

        【解决方案5】:

        您不能以这种方式设置属性,这是不允许的。您可以在构造函数/方法/属性中执行此操作。或者这样:

        public class SomeClass{        
            Car car = new Car(){ year = 2012 };
        }
        

        或者你可以将你的值传递给构造函数:

        public class Car{
            public int year;
            public Car(int year){
                this.year = year;
            }
        }
        

        还有:

        public class SomeClass{        
            Car car = new Car(2012);
        }
        

        【讨论】:

          猜你喜欢
          • 2015-10-17
          • 2021-04-11
          • 1970-01-01
          • 2014-01-07
          • 2014-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多