Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#语法静态类,使静态成员冗余?_C#_Class_Syntax_Static - Fatal编程技术网

C#语法静态类,使静态成员冗余?

C#语法静态类,使静态成员冗余?,c#,class,syntax,static,C#,Class,Syntax,Static,注意:这是第一次询问关于语法的一般好奇心的问题。因此,我可能没有使用正确的术语来描述我的问题,这可能意味着它已经得到了回答,我找不到它,因为我不知道在搜索中使用什么术语。如果是这样的话,请发表评论,这样我就可以编辑和完善问题,以满足堆栈溢出预期的标准。多谢各位 现在是问题。我最近经常使用static关键字,因为我需要在没有实例的情况下从任何地方访问成员。然而,当类本身已经是静态的时,将每个成员和方法声明为静态变得越来越乏味。因为如果你声明一个类是静态的,这意味着你不能创建该类的实例(这是我目前的

注意:这是第一次询问关于语法的一般好奇心的问题。因此,我可能没有使用正确的术语来描述我的问题,这可能意味着它已经得到了回答,我找不到它,因为我不知道在搜索中使用什么术语。如果是这样的话,请发表评论,这样我就可以编辑和完善问题,以满足堆栈溢出预期的标准。多谢各位

现在是问题。我最近经常使用static关键字,因为我需要在没有实例的情况下从任何地方访问成员。然而,当类本身已经是静态的时,将每个成员和方法声明为静态变得越来越乏味。因为如果你声明一个类是静态的,这意味着你不能创建该类的实例(这是我目前的理解)

为什么每个成员也必须声明为静态的

public static class Foo 
{
    public static int X;
    public static int Y;
}
我认为既然类foo在本例中被声明为静态的,那么它的所有成员都将自动成为静态的,并且您不再需要将每个成员声明为静态的

显然,您不能这样做,您必须将每个后续成员声明为静态。然而,这对我来说是违反直觉和多余的


原因是什么?

据我所知,类上的static是一种强制所有成员都是static的方法(从一个成员中删除static,它会给您一个错误)。但是,是的,需要定义静态方法。从技术上讲,您不需要在类上定义static

作为替代方案,您可以定义一个类,实例化该类,并全局存储该类引用,因此不需要对每个成员进行静态定义。singleton模式在本质上与静态类非常相似,只是您定义了一个共享的公共实例

简而言之,这是为了可读性。您可以只查看属性定义,知道它是静态的,而不必查看类定义

您的两行示例可能会使它看起来不必要,但是如果您有一个包含500行、1000行或更多行代码的类,那么在深入研究大量方法、属性和字段时,您会非常清楚


这就是软件开发的要点:永远不要担心额外的输入——你会读代码的次数比写代码的次数多得多

一致性-意义的一致性。使一个类保持静态不会改变该类的任何内容;它所做的只是禁止声明实例成员。类本身既不是实例也不是静态的。如果一个类上的static意味着所有成员都是static的,那么就更简洁了,但有人可能会说,这样做会在未声明为static的成员声明中引入变量解释。实际上,除非使用静态修饰符,否则成员都是实例。

除了你的主要问题之外,我最近经常使用static关键字,因为我需要从任何地方访问没有实例的成员。听起来像是单例(反)模式的潜在过度使用。我也这么认为。我有一些类充当管理者,保存整个程序需要访问的信息。永远只会有一个这样的例子。对于这些类,静态是非常有用的。然而,我一直怀疑这最终可能会导致糟糕的实践。@哎呀,为什么单身汉是反模式的呢?它不应该被过度使用,但为什么你说它是一种反模式?@DanKodi这里有一个非常好的问答以及关于单例、静态类等的相关评论:简而言之,依赖全局状态是一件坏事。也许我在这里选错了东西——但在.NET世界中,我们利用类和属性的名称来帮助保持与CLR和其他库的一致性。以下是微软的官方命名惯例:酷,谢谢。有趣的是,在你的第二点上,我没有这样想,我以前也这么做过。然而,一些大学认为这是一种不好的做法,所以我很少再使用它了,尽管我不知道这会是怎样的一种不好的做法。
public static class Foo 
{
    public static int X;
    public static int Y;
}