一  c#的运行方式

1.1 C#语言是Microsoft公司推出的面向对象的编程语言,可以快速编写各种基于.NET平台的应用。
C#语言不能孤立地使用,而必须和.NET Framework一起考虑。C#编译器专门用于.NET,C#编写的代码总是在.NET Framework中运行。

.NET Framework的核心是其运行环境,称为公共语言运行库(CLR)。通常将在CLR控制下运行的代码称为托管代码(managed code)。
在CLR执行编写好的源代码之前,需要编译它们。在.NET中,编译分为两个阶段:
①把源代码编译为公共中间语言(Common Intermediate Language,CIL);
②CLR把CIL编译为平台专用的代码。

 

CTS(通用类型系统)定义了可以在中间语言中使用的预定义数据类型,所有面向.NET Framework的语言都可以生成最终基于这些类型的编译代码。

 

在C#中声明一个int类型的数据时,声明的实际上是.NET结构System.Int32的一个实例。所以在语法上可以把所有的基本数据类型看作是支持某些方法的类。
int a=45;
string s=a.toString();

 

 

2.1:

C#的数据类型分为值类型和引用类型。
①值类型,直接存储其值,值存储于栈中。
②引用类型,存储对值的引用,而值存储在托管堆上。

 

  C#的数据类型分为值类型和引用类型。
①值类型,直接存储其值,值存储于栈中。
②引用类型,存储对值的引用,而值存储在托管堆上。

2.2类类型

类是创建对象的模板。C#类封装有数据成员和函数成员。
①数据成员:字段、常量和事件。
②函数成员:方法、属性、构造函数、析构函数、运算符、索引器。

 

3.1定义类

 

(1)命名空间

命名空间是一种特殊的分类机制,它将与一个特定功能有关的所有类型都分组到一起。命名空间有助于防止类型名称发生冲突。


(2)using指令

可以用来将来自一个命名空间的类型导入,否则引用该命名空间中的类型要使用完全限定名。


(3)方法参数的种类

C#的方法可以使用如下4种参数:
①值参数
不含任何修饰符,默认的传值方式。赋给形参的是实参的一份拷贝。
②引用参数
以ref修饰符声明,赋给形参的是实参在内存中的地址,即形参是实参的引用。实参必须被设置初始值。

③输出参数
以out修饰符声明,输出形参用于把运算结果保存到外部变量。输出形参也是引用参数,调用前无需对实参变量初始化。

④数组参数
使用params说明,数组参数必须是参数表中最后一个参数,且只允许是一维数组,不能再有ref和out修饰符。声明了一个参数数组之后,就可以将每个参数作为参数数组的一个成员来访问,由此实现数量可变的参数。

样例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace r3_1_1
{
    
 
  

   

    class Program
    {
         static void DoStatistic(string type,params double[] nums)
        {
          double result  =0.0;
            switch(type)
          {

            case"sum":
                    //计算输入数组的和
                for(int i = 0; i < nums.Length; i++ )
                     result += nums[i];
                      break;
             case"avg":
                    //计算平均值
                    for(int i = 0; i < nums.Length;i ++)
                      result += nums[i];
                  
                     result = result / nums.Length;
                      break;

          };
            Console.WriteLine("{0}: {1, 5:f2}",type, result);

         }

        static void Main(string[] args)
        {
            DoStatistic("sum", 13.5,15.5 );
            DoStatistic("avg", 1, 2, 3, 4);
         
        }
    }
}

 

结果如下;

Tips:

C#的输出格式:

 

3.2 类的实例化

⑴ 用new运算符创建对象

样例:

 class Student{
   
     public static int id;
       public static string name;
       public static int score;


       public static float  GetScore()
       {
         return score;
         
       }

       Student(int sno, string sname){
       
          id = sno;
          name = sname;

        
       }
   
   }


class Program

{
    static void Main(string[] args)
    {
        Student s = new Student(1, "zixuan");
        Console.WriteLine("{0} {1} {2}", s.id, s.name, s.GetScore());
    }
}

 ⑵ 对象初化器

class Program
{
    static void Main(string[] args)
    {
        Student s = new Student() { id = 1, name = "王五" };
        Console.WriteLine("{0} {1} {2}", s.id, s.name, s.GetScore());
    }
}

⑶ 类型推断


定义变量时类型使用var关键字,编译器可以根据变量的初始化值推断变量的类型。
 

  var s = new Student(1, "王五");

⑷ 匿名类型
匿名类型是一种特殊的类型,它最终由编译器声明。当编译器看到一个匿名类型时,会执行一些后台操作,帮你生成必要的代码,允许你像显式声明的那样使用它。
定义匿名类型的变量时,是不可能指定数据类型的,必须使用var。

class Program
{
    static void Main(string[] args)
    {
        var s = new { Sno = 1, Sname = "李四" };
        Console.WriteLine("{0},{1}", s.Sno, s.Sname);
    }
}

3.3分布类

 

使用partial关键字可定义分部类。
使用分部类的主要目的是将一个类的定义划分到多个文件中。分部类对于代码生成或修改工具来说意义重大。

样例:

Student1.cs文件如下:

    partial class Student
    {

        internal int id;
        internal string name;
        private int score;


     //构造函数
        public Student() { }
        public Student(int id, string name)
        {

            this.id = id;
            this.name = name;


        }

        public int GetScore()
        {
            return score;
            //获取score;

        }
        public void setScore(int Score)
        {
            this.score = Score;
            //设置Score
        }

       
    }

 Program.cs如下:


      partial class Student
      {
         override public string ToString()
          {
              return "id:" + id + " name:" + name + " score:" + score;
          }
      }
  
    class Program
    {

        static void Main(string[] args)
        {
           
            Student s = new Student(1, "zixuan");

            Console.WriteLine("{0}", s.ToString());

         
        }
    }

结果如下:

 3.4类的属性成员

(1)如何定义类的属性成员

样例:


    class Student
    {
        private int _id;
        private string _name;
        private double _score;
        //构造函数
        public Student(){}

        public Student(int id, string name)
        {
    
           this._id= id;
            this._name = name;
        }
        public int Id
        {
          get{return _id;}
            set{_id = value;}
        
        }
        public string Name{
        
          get{return _name;}
            set{_name = value;}
        }
        public double Score{
        
          get{return _score;}
            set{//需要判断一下成绩是否小于0
              if(value < 0)
                  _score = 0;
              else
                  _score = value;
            
            
            }
        }
    
    }
  
    class Program
    {

        static void Main(string[] args)
        {
           //实例化对象
            Student s = new Student(1, "zixuan");
            s.Score = 80;
             Console.WriteLine("{0} {1} {2}", s.Id,s.Name, s.Score);

         
        }
    }

(2)自动属性

当属性访问器中不需要任何其他逻辑时,自动实现的属性会使属性声明更加简洁。

class Student {
        public int Id { get; set; }
        public string Name { get; set; }
        public double Score { get; set; }
 
        public Student() { }
 
        public Student(int id, string name) {
            Id = id;
            Name = name;
        }
}
 class Program {
        static void Main(string[] args) {
            Student s = new Student(1, "zixuan") { Score = 100 };
            Console.WriteLine("{0} {1} {2}\n", s.Id, s.Name, s.Score);
        }
    }

 

 C#的面向对象编程