关于使用字段、方法和属性的问题

苦茶爷爷 2013-08-11 03:09:04

//先定义一个类
public class MyClass
{
public readonly string Name;
private int intVal;

public int Val
{
get
{
return intVal;
}
set
{
if (value >= 0 && value <= 10)
intVal = value;
else
throw (new ArgumentOutOfRangeException("Val", value,
"Val must be assigned a value between 0 and 10."));
}
}

public int MyInt
{
get
{
throw new System.NotImplementedException();
}
set
{
}
}

public override string ToString()
{
return "Name: " + Name + "\nVal: " + Val;
}

private MyClass()
: this("Default Name")
{
}

public MyClass(string newName)
{
Name = newName;
intVal = 0;
}
}
//以下是主程序
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Creating object myObj..");
MyClass myObj = new MyClass("My Object");
Console.WriteLine("myObj created.");
for (int i = -1; i <= 0; i++)
{
try
{
Console.WriteLine("\nAttempting to assign {0} to myObj.Val..",
i);
myObj.Val = i;
Console.WriteLine("Value {0} assigned to myObj.Val.", myObj.Val);
}
catch (Exception e)
{
Console.WriteLine("Exception {0} thrown.", e.GetType().FullName);
Console.WriteLine("Message:\n\"{0}\"", e.Message);
}
}
Console.WriteLine("\nOutputting myObj.ToString()..");
Console.WriteLine(myObj.ToString());
Console.WriteLine("myObj.ToString() Output.");
Console.ReadKey();
}
}


这是C#入门经典的例题。
我的问题是:
1 程序执行的顺序是先执行main函数,然后调用到 myclass类的吗?
2 private MyClass()
: this("Default Name")
{
}

public MyClass(string newName)
{
Name = newName;
intVal = 0;
}
这两个都是构造函数,一个私有一个公共,有什么区别?
3 myObj.Val = i,其实就是把i的值赋给类中的value,对吧?myObj.Val是myObj的一个属性,对吧?为什么value在类中不需要声明?
4 MyClass myObj = new MyClass("My Object");是把My Object作为参数传递给 public MyClass(string newName)吗?
5 执行MyClass myObj = new MyClass("My Object")时,调用到了Myclass类,在调用时,是按照什么顺序执行代码的?
6 在mian函数执行的过程中,为什么一开始执行到
Console.WriteLine("Creating object myObj..");
MyClass myObj = new MyClass("My Object");
Console.WriteLine("myObj created.");
的时候,第二句貌似没有被执行?
7 为什么我有时候修改一些代码,然后直接关闭编辑器,居然没有提示让我保存呢?比如我去掉一下无用的类,或者添加一些类的文件夹,系统居然不提示我保存?


问题比较多,谢谢大家!!
...全文
254 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jshi123 2013-08-12
  • 打赏
  • 举报
回复
MyDerivedClass myObj =new MyDerivedClass(); // 实例化一个MyDerivedClass类型对象,并把myObj指向该对象。当然是没有执行其中的方法。 MyBaseClass myBaseObj;//定义一个MyBaseClass类型的引用变量,但没有指向任何实例,其值为null myBaseObj = myObj;//将myBaseObj指向myObj引用的实例,即上面new MyDerivedClass()构造出来的实例。 MyBaseObj.DoSometing(); // 对,调用了实例“new MyDerivedClass()”的DoSomething方法。
苦茶爷爷 2013-08-12
  • 打赏
  • 举报
回复
引用 11 楼 jshi123 的回复:
是的,MyClass有两个方法。 是的,new表示你告诉编译器,你明确知道写了一个同名的方法,会隐藏掉基类中的方法。
还有个问题,主要是对构造函数,方法不懂,什么时候执行方法呢?疑问见注释,谢谢。 隐藏基类的方法问题 public class MyBaseClass { public void DoSomething() { Console.WriteLine("A") } } public class MyDerivedClass : MyBaseClass { public void DoSomething() { Console.WriteLine("B") } } 结果 B MyDerivedClass myObj =new MyDerivedClass(); // 实例化一个对象myObj通过默认的构造函数,对吧?但是没有执行?就是说没有执行方法。 MyBaseClass myBaseObj;//定义一个类成员,对吗? MyBaseObj = myObj;// 赋值?这里是啥意思呢? MyBaseObj.DoSometing(); // 使用了方法,对吧?
苦茶爷爷 2013-08-12
  • 打赏
  • 举报
回复
谢谢!!非常感谢!!
jshi123 2013-08-12
  • 打赏
  • 举报
回复
是的,MyClass有两个方法。 是的,new表示你告诉编译器,你明确知道写了一个同名的方法,会隐藏掉基类中的方法。
苦茶爷爷 2013-08-12
  • 打赏
  • 举报
回复
[quote=引用 8 楼 jshi123 的回复:] 一个关于隐藏基类方法的问题: public class MyBaseClass { public void DoSomething() { } } public class MyDerivedClass : MyBaseClass { public void DoSomething() { } } 在这里,是不是MyDerivedClass继承了MyBaseClass,连方法也继承了,而MyBaseClass自己的DoSomething()是另一个,也就是说MyDerivedClass有两个方法? 书上说在MyDerivedClass中new public void DoSomething(),就不会显示警告了,是不是因为子类和父类之间是同名方法,所以才会产生隐藏的问题啊? 谢谢
苦茶爷爷 2013-08-12
  • 打赏
  • 举报
回复
引用 8 楼 jshi123 的回复:
我指的是在这句:MyClass myObj = new MyClass("My Object"); 构造MyClass类时只执行了public MyClass(string newName)这个构造函数。 private MyClass()这个构造函数不会执行。 ToString这个方法会执行到,但是在下面的执行Console.WriteLine(myObj.ToString());的时候。 你可以按F11调试,可以很清楚看到每条语句是怎么执行的。
太感谢了,我学会了f11. thanks!!
袁涛 2013-08-12
  • 打赏
  • 举报
回复
这个好, 我来试试看
jshi123 2013-08-12
  • 打赏
  • 举报
回复
我指的是在这句:MyClass myObj = new MyClass("My Object"); 构造MyClass类时只执行了public MyClass(string newName)这个构造函数。 private MyClass()这个构造函数不会执行。 ToString这个方法会执行到,但是在下面的执行Console.WriteLine(myObj.ToString());的时候。 你可以按F11调试,可以很清楚看到每条语句是怎么执行的。
苦茶爷爷 2013-08-12
  • 打赏
  • 举报
回复
引用 5 楼 jshi123 的回复:
1。程序执行的顺序是先执行main函数,然后构造myclass类的实例。 2。私有构造函数只能在本类中调用,公有的可以由其它类调用。 3。value是上下文关键字,隐式代表set属性时的参数,不需要声明。 4。MyClass myObj = new MyClass("My Object");是把“My Object”字符串作为参数传递给 public MyClass(string newName) 5。类的初始化顺序:静态字段、静态构造方法、实例字段、实例构造方法。在你的例子中,就是执行 public MyClass(string newName) 这一个方法 6。第二句当然会执行,没有貌似。 7。天知道,vs坏掉了?
第五条回复没动,为什么之执行了public MyClass(string newName) 一个方法? public override string ToString() { return "Name: " + Name + "\nVal: " + Val; } private MyClass() : this("Default Name") { } 这两个方法没执行吗?
jshi123 2013-08-11
  • 打赏
  • 举报
回复
1。程序执行的顺序是先执行main函数,然后构造myclass类的实例。 2。私有构造函数只能在本类中调用,公有的可以由其它类调用。 3。value是上下文关键字,隐式代表set属性时的参数,不需要声明。 4。MyClass myObj = new MyClass("My Object");是把“My Object”字符串作为参数传递给 public MyClass(string newName) 5。类的初始化顺序:静态字段、静态构造方法、实例字段、实例构造方法。在你的例子中,就是执行 public MyClass(string newName) 这一个方法 6。第二句当然会执行,没有貌似。 7。天知道,vs坏掉了?
lyq8377 2013-08-11
  • 打赏
  • 举报
回复
换个小号来接着回复。 第7个问题,您是用的什么编辑器?我本地VS不存在这个问题
  • 打赏
  • 举报
回复
第6个问题,构造函数中没作Write操作,您是根据什么判断这一句没执行的?
  • 打赏
  • 举报
回复
纠正个错别字,第二点,“共有”应改为“公有”
  • 打赏
  • 举报
回复
1、你的思路是正确的 2、私有构造函数是对共有构造函数用"Default Name"作为参数传递 3、value在类中不需要声明的原因是:这是属性中的隐藏变量 4、你的思路是正确的 其余几个问题,等别的网友来说

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧