zoukankan      html  css  js  c++  java
  • # C#学习笔记——类(1)

    类的定义

    首先我们来看一下定义类的代码。

    class Example
    {
        public string Words;//定义字段
        public static int Number = 1;//定义静态字段
        //定义属性:方式1
        public string Name
        {
            get
            {
                return _name;
            }
            set
            {
                _name = value;
            }
        }
        private string _name;
        
        //定义属性:方式2
        public string City{get;set;}=”Beijing“;
        
        //定义构造函数1
        public Example(string name,string words,string city)
        {
            Words = words;
            Name = name;
            City = city;
        }
        
        //定义构造函数2
        public Example(string name)
        {
            Name = name;
        }
        
        //定义方法
        public string GetWords()
        {
            return $"{Words}";
        }
        
    }
    
    • 每个类都有一个名字,它跟在“class”关键词后面,在C#中,允许类名与文件名不同;
    • public关键字属于访问修饰符,是用来说明封装级别的。比如在上面的代码中,字符串Words和方法GetWords都被修饰为public。public是允许外部访问,即其他类也可以访问Example类里的Words字符串和GetWords方法。除了public,访问修饰符还有private(该变量或方法只能在类内部调用),protected、internal、protected internal。如果不给类中的成员(变量、方法等)添加访问修饰符,就默认是private。
    • “Words”是字段,可以理解为这个类中包含的一个变量。
    • “Number”是一个静态字段,因为它前面有“static”修饰。类似的还有静态方法和静态类。C#中没有全局变量和全局函数,可以用静态变量和静态方法等价。
    • 静态字段是属于类的而不是属于实例的。这点在调用时要注意。
    • “static”这个位置还可以换成一些其他的修饰符,比如换成“const”则表示该字段的值是个常量,不可以被改变(在声明时给他一个默认值)。
    • 属性的时用方法跟字段差别不大,但实际上Example类中并不存在Name和City字段。属性里面的get方法用来获得属性的值,set方法用来给属性赋值,value是set传入参数。具体的使用方法见下文的例子。在get和set里可以添加一些逻辑。
    • 在C#3.0之后,如果不需要对属性中get和set的逻辑进行修改,可以将方式1省略成方式2的写法(“=”之前的部分,其中“=“Beijing””是将属性City默认值设置为“Beijing”,也就是在不对它进行初始化赋值的时候它的值就是“Beijing”,当然,“=“Beijing””不写不会有语法错误。
    • 属性的方法中只写get方法不写set方法,表示该属性是只读的,反之则说明该属性是只写。但是,即不写get也不写set,会报错。
    • 属性和方法不可以作为ref或out参数值。因为ref或out参数传递时是将内存地址传给目标方法,但是属性可能是虚字段,也可能只读或只写,所以不可以传递存储地址(方法同理)。
    • 构造函数的名称与类名相同,但是它没有返回类型(没有像GetWords()前面的“string”之类的修饰字)。
    • 构造函数2是构造函数的重构,当创建Example类时,根据传入的参数符合1还是2来决定使用哪个。
    • 属性City有一个默认值“Beijing”,但是如果类创建时是调用的构造函数1(构造函数2没有初始化City),那么“Beijing”会被覆盖掉,字段也是同样的道理。因为构造函数的调用在字段和属性之后。
    • 在“class”前面加一个“partial”可以将该类分成几部分写(可以在不同的文件中),但是每部分开头都要加“partial”关键字,且类名不要弄错。比如要将Example分成多个部分写的话,每一部分的声明都应该是“partial class Example”。
    • C#允许嵌套类。

    类的实例化

    还是先放一段代码。

    Class Program
    {
        static void Main()
        {
            Example example1;//声明
            example1 = new Example("Sam","Hello","ShangHai");//使用构造函数1实例化
            Example example2 = new Example("Jam");//使用构造函数2实例化
            
            example1.Name = "XiaoMing";//对属性Name进行赋值
            
            System.Console.WriteLine(
            	$"number" = {Example.Number});//输出静态字段Number
        }
    }
    
    • example1和example2都是类Example的实例。
    • 类在实例的时候既可以先声明然后在调用new(example1),也可以在一条语句中实例化(example2)。
    • 在调用构造函数的时候,会依据参数的形式和数量,来选择一个跟它匹配的构造函数调用。
    • C++中,new来开一片内存,用完之后要用delete来释放,就像大括号的左右两半要成对出现一样,new之后要有与之匹配的delete。但是C#中new应该理解成实例化对象而不是非分配内存,也不用delete操作符。
    • 对属性Name进行赋值,是调用了Name属性中的set方法,在这里,set中value的值就是“XiaoMing”。
    • 最后一条语句是打印Example类中的静态字段Number,这里注意是Example.Number,因为静态字段(方法)属于类而不属于类的实例。
  • 相关阅读:
    【转】win8.1下安装ubuntu
    Codeforces 1025G Company Acquisitions (概率期望)
    Codeforces 997D Cycles in Product (点分治、DP计数)
    Codeforces 997E Good Subsegments (线段树)
    Codeforces 1188E Problem from Red Panda (计数)
    Codeforces 1284E New Year and Castle Building (计算几何)
    Codeforces 1322D Reality Show (DP)
    AtCoder AGC043C Giant Graph (图论、SG函数、FWT)
    Codeforces 1305F Kuroni and the Punishment (随机化)
    AtCoder AGC022E Median Replace (字符串、自动机、贪心、计数)
  • 原文地址:https://www.cnblogs.com/SummerMorning/p/12906301.html
Copyright © 2011-2022 走看看