使用带有属性的静态方法

本文关键字:静态方法 属性 | 更新日期: 2023-09-27 17:51:02

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

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#新手,我可以使用一些帮助。

使用带有属性的静态方法

你也需要让你的属性是静态的:

public static string _string1 { get; set; }
public static string _string2 { get; set; } 
从本质上讲,静态方法没有状态。当以非静态方式声明时,这些字段本质上类似于状态,因此不能访问它们。通过将它们标记为static,您表示这是AppDomain的全局值。

使用这样的静态字段时需要注意的一点是,如果你开始使用任何类型的线程并试图存储状态,那么你可能会在调试时遇到严重的问题,因为你不知道共享资源处于什么状态。

防止这种情况发生的一种方法(如果你不需要state)是将这些定义为常量字段。那么你就不能修改它们,但这意味着你不必担心有人在你没有预料到的情况下修改它们。
public const string _string1;
public const string _string2;

静态方法始终只能访问其他静态成员。现在,因为你的属性不是静态的,所以你的静态方法不能访问/操作它们。

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

例如

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.

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

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

您可以创建一个类的新实例,其中包含变量。

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;
   }
}