1

我在 Visual Studio 中使用 Resharper 工具

考虑下面写的一个非常简单的类。

class Test()
{

   //constructors do not have any return type.   
   Test()
   {
      System.Console.WriteLine("Hello World!");
   } 

   static Test()
   {
        System.Console.WriteLine("Hello World in Static constructors");
   }

   public void A()
   {
      System.Console.WriteLine("A simple function in a class");
   }

}


class Program
  {
    static void Main(string[] args)
    {
        var asa = new Test(); //Implicitly Typed local variables.
        asa.A();

    }
}

使用 var(编译器必须从初始化语句右侧的表达式推断变量的类型)。

我有一些澄清问题,它们在下面。

  1. 编译器的额外负担?
  2. 一个类可以有多少个构造函数?
  3. 为什么首先调用静态构造函数?(我通过设置断点来检查?)
  4. 为什么不测试 asa = new Test(); 不是 Resharper 的首选?
  5. 作为初学者首先使用 Resharper 真的是个好主意吗?(我自己是 C 和 .net 编程的新手!)

提前致谢。

4

4 回答 4

7
  1. 编译器的任何额外负担基本上是无关紧要的——它不应该成为您决定是否使用var. 正如评论中所指出的,当您使用显式声明的变量时,编译器可能需要做更多的工作......但同样,它并不重要。

  2. 一个类可以有任意数量的构造函数……尽管它很快就会变得笨拙。

  3. 静态构造函数将在第一次使用类之前被调用一次(无论是通过静态方法还是构造函数调用)。阅读 C# 规范以获取更多详细信息 - C# 5 规范的第 10.12 节包括:

    封闭类类型的静态构造函数在给定的应用程序域中最多执行一次。静态构造函数的执行由在应用程序域中发生的以下第一个事件触发:

    • 类类型的一个实例被创建。
    • 类类型的任何静态成员都被引用。
  4. 您可以将 ReSharper 配置为建议替代方案,或将其视为警告等。在这方面,让它按您认为应该的方式工作。

于 2012-09-17T06:06:45.653 回答
2
  1. 如果有的话可以忽略不计。否则返回类型将被编译检查。无论如何,你不应该以此为基础做出决定。
  2. 只要它们是可区分的,您想要多少就多少。
  3. 静态构造函数是类型定义的一部分。当第一次引用类型时调用它们。
  4. 你收到什么信息?R# 是可配置的。

编辑:(你不能打败飞碟)。

于 2012-09-17T06:10:17.370 回答
2
  1. 是的,需要做一些额外的工作,但var只能在编译器很容易推断类型的情况下使用关键字。

  2. 构造函数的数量没有限制,但构造函数必须遵循一些规则(即:编译器需要明确调用哪个构造函数)

  3. 我不能告诉你为什么——假设这只是规则之一。有趣的是 beforefieldinit (http://stackoverflow.com/questions/610818/what-does-beforefieldinit-flag-do, http://cshapindepth.com/Articles/General/Beforefieldinit.aspx )

  4. 我个人认为,在这种情况下,这只是一个品味问题。有些人倾向于var尽可能多地使用,而另一些人则相反。我尝试在以下情况下使用:

    • 我正在使用集合(或者需要大量文本来告诉编译器类型:而不是:
Dictionary<<OneOfMyClasses, OtherClasss> dictionary = new Dictionary<OneOfMyClasses, OtherClass>();

我倾向于使用var

var dictionary = new Dictionary<OneOfMyClasses, OtherClass>();

请注意,它不会影响代码的可读性(即仍然很容易理解实际发生的事情)。

于 2012-09-17T06:14:44.203 回答
0

感谢大家。在花了一些时间研究之后,我想补充一些可能对某人有所帮助的观点。

免责声明:(以下几点来自(甚至粘贴)codeproject 和其他此类网站。

1) 每个类只能有一个静态构造函数。

原因:静态构造函数必须是无参数的或简单的,不允许构造函数重载。由于 CLR 将调用此构造函数,因此我们无法控制将值传递给此函数。由于我们不能直接调用静态构造函数,因此拥有多个静态构造函数是没有意义的。

class Test
{
   static Test() {...}
   static Test(int a) {...} //would throw error as "Static constructor must be parameter less"
}

2) 静态构造函数的声明应该没有任何访问说明符。

原因:CLR 将再次调用静态构造函数,而不是类的任何对象。因此,我们不需要任何访问说明符。

3) 静态构造函数只能操作该类的静态变量

原因:非静态成员特定于对象实例。修改其值依赖/绑定到其特定对象实例的变量是没有意义的。

4) 为什么要使用静态构造函数?给我一个很好的例子

原因:您可以使用静态构造函数,例如当您想要记录您将使用该类执行的操作时。MSDN 说“静态构造函数的典型用途是当类使用日志文件并且构造函数用于将条目写入该文件时”。

5) 何时调用静态构造函数?

答:用户无法控制程序中何时执行静态构造函数。.正如其他人和 MSDN 指出的那样,“在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。”

6)在C#中使用基类和派生类时,在创建派生类的新实例时,是先调用基类构造函数还是先调用派生类构造函数?

答:首先调用基类构造函数,然后调用派生类构造函数。

代码示例

class DerivedClass : ParentClass
{
     public DerivedClass()
     {
         Console.WriteLine("Derived class constructor!");
     }

}

 class ParentClass
{
     public ParentClass()
     {
         System.Console.WriteLine("Parent class constructor!");
     }
}

class Program
{
    static void Main(string[] args)
    {

        var a = new DerivedClass(); //Implicitly Typed local variables.

    }
}

7)为什么在你上面的例子中,两个构造函数都有公共访问说明符?如果我指定私有或根本不指定访问说明符怎么办?

答:当你没有指定访问说明符时(这种情况下,构造函数自动变为私有)或者当你使用私有访问说明符时,类不能被实例化。每当一个类包含一个或多个私有构造函数时,它严格(!)不能被实例化。这种类型的构造函数称为特殊实例构造函数,一般在类的所有成员都是静态方法时使用。(可能数学课应该是一个很好的例子。)

**8)关于继承的奖金问题。一个类是否继承自两个不同的类?

严格来说没有。C# 只支持直接继承,当然你也可以使用接口。例如,

    interface Test
   {
         void abc();
   }  
   class DerivedClass : ParentClass, Test //Test should not be a class. It can be  a interface.
{
     public DerivedClass()
     {
         Console.WriteLine("Derived class constructor!");
     }

     public void abc()
     {
          //should be publicly defined!
          //non public method could not implement from interface Test
     }

}

 class ParentClass
{
     public ParentClass()
     {
         System.Console.WriteLine("Parent class constructor!");
     }
}
于 2012-09-17T16:45:48.330 回答