关于C#的一些小知识

问题一 :是否可以从一个static方法内部发出对非static方法的调用?

 

不行,
可以这样理解
static修饰的方法可以直接用类名调用
非static修饰的方法必须用类new出对象才能调用
当我们用类名直接调用时,可能这个类的对象并没有new。
如果这时候static方法里调用非static的方法就会出现空指针异常,
当然这种错误编译时就不会通过。

错误代码演示:

 1  class Program
 2     {
 3 
 4         public int fact(int n)
 5         {
 6             if (n <= 1)
 7                 return 1;
 8             else
 9                 return n * fact(n-1);
10         }
11 
12         static void Main(string[] args)
13         {
14             //利用递归来计算阶乘
15             fact    //看到了吗?fact是根本打不出来的。
16            
17         }
18     }

 正确代码演示:

 

 1  class Program
 2     {
 3 
 4         static int fact(int n)
 5         {
 6             if (n <= 1)
 7                 return 1;
 8             else
 9                 return n * fact(n-1);
10         }
11 
12         static void Main(string[] args)
13         {
14             //利用递归来计算阶乘
15             Console.WriteLine(fact(3)); 
16            
17         }
18     }

 

 

问题二:继承接口之后必须要全部继承接口里面的内容吗?

是的,必须全部继承。

我写一个接口:

1 namespace 结构测试
2 {
3     interface Interface1
4     {
5         void  first();
6         void second();
7     }
8 }

我在控制台去实现这个接口的第一个方法,看看情况:

 1 namespace 结构测试
 2 {
 3     class Program:Interface1
 4     {
 5         static void Main(string[] args)
 6         {
 7 
 8         }
 9 
10         public void first()
11         {
12             Console.WriteLine("我只想实现这一个方法");
13         }
14 
15       
16     }
17 }

运行,结果报错:

问题三:抽象类到底是怎么用的?

为什么要写抽象类?所谓抽象不就是把某些物体的共同特点集合起来吗?比如你可以吃饭,睡觉,学习。你的同学也可以吃饭,睡觉,学习。好了,你们都具有这些共同的特征,不只是你们,所有的人都这样,这就可以抽象出一个类--Person。那么抽象类该怎么用呢?

抽象类Class1:

 1 namespace 抽象类
 2 { 
 3     abstract class Class1
 4     {
 5         public abstract void start(); 
 6         public  void update()
 7         {
 8             Console.WriteLine("我是抽象类里面的不抽象方法");
 9         }
10     }
11 }

Class1这个抽象的类我给他写了两个方法,一个是抽象方法start,一个是非抽象方法update.注意到了没,抽象方法是不允许有方法体的。

下面我们再来写一个普通的类Class2来继承抽象类Class1:

 1 namespace 抽象类
 2 {
 3     class Class2:Class1
 4     {
 5         public override void start()
 6         {
 7             Console.WriteLine("我继承了抽象方法");
 8         }
 9         public  void strt()
10         {
11             update();
12         }  
13     }
14 }

可以看到,抽象类Class1里面的抽象方法start被继承并重构了方法体,而且非抽象方法update也可以直接继承。

下面来控制台应用程序:

 1 namespace 抽象类
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             Class2 jj =new Class2();
 8             jj.start();
 9             jj.strt();
10         }
11     }
12 }


普通类Class2实例化了一个对象jj,然后jj可以调用start方法和strt方法。

注意事项:抽象类不能实例化。抽象方法不能有方法体。

问题四:string类型创建的字符串的内容是不可变的

先上图,咱们看图说话。

比如我最初定义了一个字符串s,初始值为 "蜀云泉" 。

1 string s = "蜀云泉";

我们可以看到这个字符串s的内容是存放在堆里面的,而s存放在栈里面只是起一个引用的作用。可以看到我在图上s画了一条虚线指向 “蜀云泉” 。现在我执行新的操作:

1 s = s + "喜欢写博客";

好了,s并没有直接在蜀云泉那块内存增加我写的字符串,而是新开辟了一块内存去重新存储。这时s指向了那块新的存储空间。而那个旧的存储空间“蜀云泉”过一段时间之后系统会自动把它清理掉。

 

问题五:字符串怎么写成多行?

有时候字符串实在是太长了,全部写在一行吧,既不美观也不方便查看,所以怎么写成多行呢?有两种方法:

方法一:

string Str="字符串1"+
"字符串2";

方法二:

string Str=@"字符串1
             字符串2"

 

问题6:输入日期怎么判断是周几?

  int days = (int)Convert.ToDateTime("时间").DayOfWeek;

周日是0,其它的数字对应。

 

posted @ 2015-10-15 18:15  蜀云泉  阅读(377)  评论(4编辑  收藏  举报