//先定义一个类
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 为什么我有时候修改一些代码,然后直接关闭编辑器,居然没有提示让我保存呢?比如我去掉一下无用的类,或者添加一些类的文件夹,系统居然不提示我保存?
问题比较多,谢谢大家!!

解决方案 »

  1.   

    1、你的思路是正确的
    2、私有构造函数是对共有构造函数用"Default Name"作为参数传递
    3、value在类中不需要声明的原因是:这是属性中的隐藏变量
    4、你的思路是正确的
    其余几个问题,等别的网友来说
      

  2.   

    第6个问题,构造函数中没作Write操作,您是根据什么判断这一句没执行的?
      

  3.   

    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坏掉了?
      

  4.   


    第五条回复没动,为什么之执行了public MyClass(string newName) 一个方法?
            public override string ToString()
          {
             return "Name: " + Name + "\nVal: " + Val;
          }
     
           private MyClass()
             : this("Default Name")
          {
          }
    这两个方法没执行吗?
      

  5.   

    我指的是在这句:MyClass myObj = new MyClass("My Object");
    构造MyClass类时只执行了public MyClass(string newName)这个构造函数。
    private MyClass()这个构造函数不会执行。
    ToString这个方法会执行到,但是在下面的执行Console.WriteLine(myObj.ToString());的时候。
    你可以按F11调试,可以很清楚看到每条语句是怎么执行的。
      

  6.   

    太感谢了,我学会了f11.
    thanks!!
      

  7.   

    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(),就不会显示警告了,是不是因为子类和父类之间是同名方法,所以才会产生隐藏的问题啊?谢谢
      

  8.   

    是的,MyClass有两个方法。是的,new表示你告诉编译器,你明确知道写了一个同名的方法,会隐藏掉基类中的方法。
      

  9.   


    还有个问题,主要是对构造函数,方法不懂,什么时候执行方法呢?疑问见注释,谢谢。隐藏基类的方法问题
    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(); // 使用了方法,对吧?
      

  10.   

    MyDerivedClass myObj =new MyDerivedClass(); // 实例化一个MyDerivedClass类型对象,并把myObj指向该对象。当然是没有执行其中的方法。
    MyBaseClass myBaseObj;//定义一个MyBaseClass类型的引用变量,但没有指向任何实例,其值为null
    myBaseObj = myObj;//将myBaseObj指向myObj引用的实例,即上面new MyDerivedClass()构造出来的实例。
    MyBaseObj.DoSometing(); // 对,调用了实例“new MyDerivedClass()”的DoSomething方法。