五.成员属性

1.成员属性的基本概念

基本概念:

(1)用于保护成员变量

(2)为成员属性的获取和赋值添加逻辑处理

(3)解决3P的局限性

        public——内外访问

        private——内部访问

        protected——内部和子类访问

        属性可以让成员变量在外部(只能获取不能修改)或者(只能修改,不能获取)

2.成员属性的基本语法

访问修饰符        属性类型        属性名

{

        get{}

        set{}

}

class Person
{
    private string name;
    private int age;
    
    //成员属性命名(帕斯卡命名法)
    public string Name
    {
        get
        {
            //意味着  这个属性可以获取的内容
            return name;
        }
        set
        {    
            //value  关键字  用于表示外部传入的值
            name = value;
        }
    }
}

3.成员属性的使用

class Person
{
    private string name;
    private int age;
    
    //成员属性命名(帕斯卡命名法)
    public string Name
    {
        get
        {
            //意味着  这个属性可以获取的内容
            return name;
        }
        set
        {    
            //value  关键字  用于表示外部传入的值
            name = value;
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        p.Name ="念陈cbwindy";
        Console.WriteLine(p.Name);
        p.Name ="阿巴阿巴";
        Console.WriteLine(p.Name);
    }
}

4.成员属性中  get和set前可以加访问修饰符

注意:

(1)默认不加,会使用属性申明是的访问权限

(2)加的修饰符要低于属性的访问权限

(3)不能让get和set的访问权限都低于属性的权限

①不能得到只能修改(private get)

class Person
{
    private string name;
    private int age;
    
    //成员属性命名(帕斯卡命名法)
    public string Name
    {
        private get
        {
            //意味着  这个属性可以获取的内容
            return name;
        }
        set
        {    
            //value  关键字  用于表示外部传入的值
            name = value;
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        p.Name ="念陈cbwindy";
        //Console.WriteLine(p.Name);
        p.Name ="阿巴阿巴";
        //Console.WriteLine(p.Name);
    }
}

②不能修改只能获取(private set)


class Person
{
    private string name;
    private int age;
    
    //成员属性命名(帕斯卡命名法)
    public string Name
    {
        get
        {
            //意味着  这个属性可以获取的内容
            return name;
        }
        private set
        {    
            //value  关键字  用于表示外部传入的值
            name = value;
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        //p.Name ="念陈cbwindy";
        Console.WriteLine(p.Name);
        //p.Name ="阿巴阿巴";
        //Console.WriteLine(p.Name);
    }
}

5.get和set可以只有一个

只有一个时,没必要在前面添加访问修饰符

一般情况下,只会出现  只有get的情况

6.自动属性

作用:外部能得不能改的特征

如果类中有一个特征是只希望外部能得不能改的,又没什么特殊处理,那么可以直接使用自动属性

public float Height
{
    get;
    private set;
}

六.索引器

1.索引器基本概念

基本概念:让对象可以像数组一样通过索引访问其中的元素,使程序看起来更直观,更容易编写

2.索引器语法

访问修饰符        返回值        this[ 参数类型        参数名,参数类型        参数名…… ]

{

        内部写法和规则和属性相同

        get{ }

        set{ }

}

class Person
{
    private string name;
    private int age;
    private Person[] friends;

    public Person this[int index]
    {
        get
        {
            return friends[index];
        }
        set
        {
            friends[index] = value;
        }
    }
}

3.索引器使用

class Person
{
    private string name;
    private int age;
    private Person[] friends;

    public Person this[int index]
    {
        get
        {
            return friends[index];
        }
        set
        {
            friends[index] = value;
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        //索引器的使用
        p[0] = new Person();
        Console.WriteLine(p[0]);
    }
}

4.索引器中可以写逻辑

class Person
{
    private string name;
    private int age;
    private Person[] friends;

    public Person this[int index]
    {
        get
        {
            if(friends == null || friends.Length - 1 < index)
            {
                return null;
            }
            return friends[index];
        }
        set
        {
            if(friends == null)
            {
                friends = new Person[]{value};
            }
            //自己规定的逻辑(如果传进来的索引大于数组的长度,你们传进来的朋友就顶替掉当前数组中的最后朋友)
            else if(index > friends.Length - 1)
            {    
                friends[friends.Length - 1] = value;
            }
            else
            {
                friends[index] = value;
            }
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        //索引器的使用
        p[0] = new Person();
        Console.WriteLine(p[0]);
    }
}

5.索引器可以重载

重载:函数名相同,参数类型,数量,顺序不同

class Person
{
    private string name;
    private int age;
    private Person[] friends;

    private int[,] array;
        
        
    public int this[int m,int n]    
    {
        get
        {
            return array[m,n];
        }
        set
        {
            array[m,n] = value;
        }
    }

    public Person this[int index]
    {
        get
        {
            if(friends == null || friends.Length - 1 < index)
            {
                return null;
            }
            return friends[index];
        }
        set
        {
            if(friends == null)
            {
                friends = new Person[]{value};
            }
            //自己规定的逻辑(如果传进来的索引大于数组的长度,你们传进来的朋友就顶替掉当前数组中的最后朋友)
            else if(index > friends.Length - 1)
            {    
                friends[friends.Length - 1] = value;
            }
            else
            {
                friends[index] = value;
            }
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        //索引器的使用
        p[0] = new Person();
        Console.WriteLine(p[0]);
    }
}

七.静态成员

1.静态成员基本概念

静态关键词  static

用static 修饰的  成员变量、方法、属性等都称为静态成员

特点:直接用用类名点出使用

2.早已出现的静态成员

比如Console是一个静态类,里面有很多的静态成员,Console.WriteLine();

这个就是对早已出现的静态成员的使用

3.自定义静态成员

class Test
{
    //静态成员变量
    static public float PI = 3.1415926f;
    //成员变量
    public int testInt = 100;
    
    //静态成员方法
    static public float CalcCircle(float r)
    {
        return PI * r * r;
    }
    //成员方法
    public void TestFunciton()
    {
        Console.WriteLine("123");
    }
}

4.静态成员的使用

class Test
{
    //静态成员变量
    static public float PI = 3.1415926f;
    //成员变量
    public int testInt = 100;
    
    //静态成员方法
    static public float CalcCircle(float r)
    {
        return PI * r * r;
    }
    //成员方法
    public void TestFunction()
    {
        Console.WriteLine("123");
    }
}
class Program
{
    static void Main()
    {
        Console.WriteLine(Test.PI);
        Console.WriteLine(Test.CalcCircle(2));
        Test t = new Test();
        Console.WriteLine(t.testInt);
        t.TestFunction();
    }
}

非静态成员变量,需要使用必须先实例化对象

5.为什么可以直接点出来使用

程序是不能无中生有的,我们要使用的对象,变量,函数都是要在内存中分配内存空间的,之所以要实例化对象,目的就是分配内存空间,在程序中产生一个抽象的对象

静态成员的特点:

程序开始运行时,就会分配内存空间,所以我们就能直接使用,静态成员和程序同生共死;只要使用了它,直到程序结束是内存空间才会被释放,所以一个静态成员就会有一个自己唯一的一个“内存小房间”,这让静态成员就有了唯一性,在任何地方使用都是用的独立内存空间的内容,改变也是改变独立空间的内容

6.静态函数中不能使用非静态成员

成员变量只能将对象实例化出来后,才能点出来使用,不能无中生有

不能直接使用非静态成员 否则会报错

如果需要使用,需要在静态函数中,先实例化对象,才可以使用非静态成员

7.非静态函数可以使用静态成员

静态成员与程序同生共死,运行即分配了内存空间,无需实例化就可以使用,所以在非静态函数中也可以使用。

8.静态成员对于我们的作用

静态变量:

(1)常用唯一变量的申明

(2)方便别人获取的对象申明

静态方法

(1)常用的唯一的方法申明  比如  相同规则的数学计算相关函数

9.常量和静态变量

const(常量)可以理解为特殊的static(静态)

相同点:他们都可以通过类名点出使用

不同点:

(1)const 必须初始化,不能修改  static没有这个规则

(2)const 只能修饰变量,static可以修饰很多

(3)const 一定是写在访问修饰符后面的,static没有这个要求

class Test
{
    //常量
    public const float G = 9.8f;
}
class Program
{
    static void Main()
    {
        Console.WriteLine(Test.G);
    }
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐