【问题标题】:using static methods with properties使用具有属性的静态方法
【发布时间】:2014-04-27 05:42:33
【问题描述】:

几天前我发现了一些属性(不确定我是否理解如何很好地使用它们)。所以我决定做一些测试。 所以这就是我所做的: 我创建了一个包含一些属性的类,例如:

public string _string1 { get; set; }
public string _string2 { get; set; } 

然后我在同一个类中创建了一个方法,可以这样说:

public static string  Example()
{
   switch(_string1.length > _string2.length)
   {
      case true :
             return _string1;
             break;
      default : return _string2;
   }
}

只是一个愚蠢的例子来理解一下 然后我从主类中调用了该方法,之后出现了几个错误: 非静态字段、方法或属性“xxx.properties._string1.get”需要对象引用

这当然是一个愚蠢的错误,但我是 c# 新手,我可以寻求帮助。

【问题讨论】:

标签: c# methods properties static


【解决方案1】:

您也需要将属性设为静态:

public static string _string1 { get; set; }
public static string _string2 { get; set; } 

本质上,静态方法没有状态。那些以非静态方式声明的字段本质上就像一个状态,因此它不能访问它们。通过将它们标记为静态,您可以说这是 AppDomain 的全局值。

然而,使用这样的静态字段要警惕的一点是,如果您开始使用任何类型的线程并尝试存储状态,那么您最终可能会遇到令人讨厌的调试问题,因为您不知道自己处于什么状态共享资源在里面。

防止这种情况的一种方法(如果您不需要状态)是将它们定义为常量字段。那么你就不能修改它们,但这意味着你不必担心有人在你没有预料到的时候改变它们。

public const string _string1;
public const string _string2;

【讨论】:

  • 小类型:属性,而不是字段。
  • @oleksii:我已经更新以反映这一点 - 尽管如果他们不了解静态,并非所有人都可能知道 AppDomain 是什么。
  • @user3210018:太好了 - 如果它有帮助并且没有更好的答案,请随时接受它作为答案。
【解决方案2】:

静态方法始终只能访问其他静态成员。现在,由于您的属性不是静态的,因此您的静态方法无法访问/操作它们。

您可以将这些字段设为静态,然后错误就会消失。一旦这些是静态的,就不需要对象引用来访问它们。 然后可以通过类名本身简单地访问它们。

例如

public class YourClass
{
  public static string _string1 { get; set; }
  public static string _string2 { get; set; } 

  public static string  Example()
  {
    switch(_string1.length > _string2.length)
    {
     case true :
         return _string1;
         break;
     default : return _string2;
    }
  }
}

现在在你的程序中:

YourClass._string1="some string";  // You can access the static properties with class name
YourClass._string2="some other string";

YourClass.Example() // You can call the static function with class name.

【讨论】:

    【解决方案3】:

    这都是关于实例与静态范围的。虽然上面的示例使您的错误消失,但了解何时使用静态方法、变量、属性与实例方法非常重要。实际上,您可以说使用静态成员并不是真正的纯 OOP 实践。大多数时候,静态成员被滥用是因为人们误解了这些 OOP 基础知识。

    静态方法和变量在您的类的所有对象实例之间共享。因此,在大多数情况下,您需要有一个特定的要求才能拥有静态方法/变量,例如将对象的总数保存在一个静态变量中,该变量可以跨所有对象实例访问。

    【讨论】:

      【解决方案4】:

      您可以在变量所在的类中创建一个新实例。

      public class YourClass
      {
         public string _string1 { get; set; }
         public string _string2 { get; set; } 
         ...
      }
      
      public static string  Example()
      {
         YourClass yourClass = new YourClass();
         switch(_string1.length > _string2.length)
         {
            case true :
                   return yourClass._string1;
                   break;
            default : return yourClass._string2;
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-13
        • 1970-01-01
        • 2015-12-22
        • 2010-09-24
        相关资源
        最近更新 更多