我是一名学习C#的C++程序员.我目前正在Nutshell中阅读C#4.0.
我在第74页上发表了这句话/ snipet:
静态字段初始值设定项按声明字段的顺序运行.以下示例说明了这一点:X初始化为0,Y初始化为3.
class Foo
{
public static int X = Y; // 0
public static int Y = 3; // 3
}
Run Code Online (Sandbox Code Playgroud)
我不明白如何在Y中分配值,而不首先声明Y. 我在这里错过了什么吗?
顺便说一下,来自C++背景,我倾向于使用术语ctor作为构造函数 - 但是,我还没有在C#中使用这个术语 - ctor世界中也使用了ctor一词吗?
[编辑]
同一页面上的另一个例子(在前面提到的书中)是这样的:
class Program
{
static void Main() { Console.WriteLine (Foo.X); } // 3
}
class Foo
{
public static Foo Instance = new Foo();
public static int X = 3;
Foo() { Console.WriteLine (X); } // 0
}
Run Code Online (Sandbox Code Playgroud)
该书陈述(上例):
该示例打印0后跟3,因为实例化Foo的字段初始值设定项在X初始化为3之前执行:
我在这些例子中还有一些问题.
这两个示例都出现在标题为静态构造函数和字段初始化顺序的部分下,但代码示例中没有显示静态ctor - 至少不是我能够轻易识别的.我期待一个静态ctor与该类具有相同的名称,是无参数的,并且前面是' static '关键字.所以我不明白这些例子与章节标题的关系.我在这里错过了什么? …
我正在学习C#(C++背景),我已经遇到了这段代码:
public interface IUndoable { void Undo(); }
public class TextBox : IUndoable
{
void IUndoable.Undo() { Console.WriteLine ("TextBox.Undo"); }
}
public class RichTextBox : TextBox, IUndoable
{
public new void Undo() { Console.WriteLine ("RichTextBox.Undo"); }
}
Run Code Online (Sandbox Code Playgroud)
由于RichTextBox派生自TextBox,任何人都可以解释为什么RichTextBox也来自IUndoable吗?我原以为IUndoable接口将与RichTextBox可以访问的任何其他TextBox成员"一起继承"?
顺便说一句,我猜测到目前为止我所读到的内容,C#中不存在公共,受保护和私有继承的概念.
这是正确的推论吗?如果是这样,那么在C#中如何实现这种行为(即限制继承)?
[编辑]
澄清:我正在阅读的书中的部分是关于隐式和显式接口实现的细微差别和潜在问题 - 所以我明白了.此外,代码片段(从本书中复制)是故意冗长的,以便解释由于调用在基类中隐式实现的重新实现的成员方法而导致的不同语义(phew!).
我的主要问题可简单归纳为:
可以这样:
public class RichTextBox : TextBox, IUndoable
{
public new void Undo() { Console.WriteLine ("RichTextBox.Undo"); }
}
Run Code Online (Sandbox Code Playgroud)
写作:
public class RichTextBox : TextBox
{
public new void Undo() { Console.WriteLine ("RichTextBox.Undo"); }
}
Run Code Online (Sandbox Code Playgroud)
如果是的话,为什么作者是冗长的(他必须有一个我确定的理由).如果不是,为什么接口不是从TextBox继承的?
我已广泛使用Python来执行各种特殊数据调整和辅助任务.由于我正在学习C#,我认为看看我是否可以用C#重写其中的一些脚本会很有趣.
是否有可执行文件可以获取.cs文件并运行它ala python?