使用带有属性的静态方法
本文关键字:静态方法 属性 | 更新日期: 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;
}
}