c#面向对象(三)

函数定义和使用函数

小理解

怎么样能被定义为函数呢,其实也就是把一些重复的操作,专门放在一个地方/代码块里面,需要用到的时候在调用就可以了,特定类型的函数称为方法。

函数的好处呢,提高代码的可读性,函数可以创建多用途的代码

简单使用

static void Write(){
Console.WriteLine("这是write函数");
}
 static void Main(string[] args)
        {
 Program.Write();
            Console.ReadKey();
}
//定义函数的时候必须适用圆括号
//函数名:PascalCase

返回值

void就是一个,当函数返回一个值时。不能使用void。使用return结束函数的执行,把返回值给调用的

表达式体方法使用

static returntype functionname ()=><myvall*myvalue2>

参数

形参是函数定义的一部分,而实参则有调用代码传递给函数。

(paramtype paramname)这种形式

调用参数时,必须是提供的参数和函数定义的参数完全匹配

关于参数数组,只能指定一个,这个参数必须位于函数定义当中参数的最后一个,可以允许使用个数不定参数来调用。params type[] paramsname。

在使用参数的时候,是把一个值参数传递给一个函数所使用的变量,在函数中对此变量的任何修改都不影响函数调用中指定的参数。

ref参数,和out参数,在前面方法中提到了

把未赋值的变量用作ref参数时非法的,但可以使用未赋值的变量out参数,在函数中使用out参数,把它看作未赋值的

元组

从函数返回多个值用怎样的方法呢,out参数,结构,数组?如果需要用代码来创建,初始化,引用和读写,就应该考虑元组了。

var numbers={1,2,3,4,5}

变量的作用域

考虑局部作用域和全局作用域的含义,在一个代码块内部,外部为什么不能调用。

局部作用域可以有相同的名称,不会相互干涉


Main()函数

main函数作为c#应用程序的入口点,执行这个函数就是执行应用程序,也就是main函数结束,整个应用程序也就结束。


结构函数

struct CustomerName{
public string firstName;
}

委托

委托是一种储存函数引用的类型。委托的声明类似于函数,但不带函数体,要是用delegate关键字。委托的声明包含一个返回值和参数列表。

嵌套类和匿名类

//嵌套类
//在c#中可以将一个类的定义在另一个类的内部
//外面的类叫外部类,内部的类叫嵌套类
//外部类和内部类之间可以相互访问
//new 外部类.内部类()可以创建内部类的对象
//非静态类访问需要创建类对象
//静态成员可以之间访问或通过类名访问,
//外部类
class Ab{
//内部类
class Ba{
}
}
internal class Program
    {
        static void Main(string[] args)
        {
            OuterClass.InnerClass innerclass=new OuterClass.InnerClass();
            innerclass.Show();
            OuterClass outerClass=new OuterClass();
            outerClass.Print();
            Console.ReadKey();
        }
    }
    //外部类
    class OuterClass
    {
        public string name = "OuterClass";//如果静态成员,如果非静态成员
        public void Print() {
            Console.WriteLine($"{name}");
            //Console.WriteLine($"{InnerClass.name}");
            Console.WriteLine($"{new InnerClass().name}");
        }
        //内部类
        public class InnerClass
        {
            public  string name= "InnerClass";//如果静态成员,如果非静态成员
            public void Show() {
                Console.WriteLine($"{name}");
                // Console.WriteLine($"{OuterClass.name}");
                Console.WriteLine($"{new OuterClass().name}");
            }
        }
    }
//匿名类
//如果某个类的实例对象只会使用一次,可以使用匿名类的方式创建这个对象。
//不需要定义类,我们就可以创建一个对象
//这样的类一般用于存储一组只读数据
var p=new {Name="zhangsan",Age=18};

this和static使用

 #region
//this
//定义:this关键字主要指的是调用者本身,调用者当前对象
//区分成员字段和局部变量
//调用其他构造函数
class Student{
public int id;
public string name;
public Student(){
Console.WriteLine("无参构造函数")
}//无参构造函数
//this可以指向当前对象的另一个构造函数
public Student(int id,string name):this(){
//this代表当前对象,也是赋值的对象student
this.id=id;
this.name=name;
Console.WriteLine("有参构造函数")
}
}
 Student student = null;
            student = new Student(100,"zhangsan");
            #endregion
//static
//如果使用static修饰函数该函数就是静态函数,如果不修饰就是非静态函数
//静态函数可以直接使用类名调用,非静态函数必须使用对象调用
 class MyMath
        {
            public static double GetAtea(double x)
            {
                return x * x*3.14;
            }
        }
//静态函数可以直接使用类名调用
 Console.WriteLine(MyMath.GetAtea(10));
            Console.ReadKey();
//静态函数:静态函数中使用的静态字段
//静态字段:静态字段的初始化最好放在静态构造函数中
//静态属性:静态字段的属性一定是静态属性
//静态构造函数:主要用于静态字段的初始化,类加载的时候自动调用,不需使用new关键字调用
//静态类:所有的成员都是静态的类称之为静态类

运算符重载

//运算符重载指的是给特定的运算符指定新的运算规则
  class Vector
        {
            private int x;
            private int y; 
            private int z;
            //运算符重载,当运算符重载的是条件运算符的时候不允许成对出现
            public static bool operator==(Vector a, Vector b)
            {
                return a.x==b.x&&a.y==b.y&&a.z==b.z;
            }
            public static bool operator !=(Vector a, Vector b)
            {
                return a.x != b.x || a.y != b.y || a.z != b.z;
            }
            //运算符+
            public static Vector operator +(Vector a, Vector b)
            {
                return new Vector(a.x + b.x , a.y + b.y , a.z + b.z);
            }
            public Vector()
            {

            }
            public Vector(int x, int y, int z)
            {
                this.x = x;
                this.y = y;
                this.z = z;
            }
            public void GetArea()
            {
                Console.WriteLine($"x={x},y={y},z={z}");
            }
        }
        static void Main(string[] args)
        {
            Vector v = new Vector(1,2,3);
            Vector v1 = new Vector(3,2,1);
            Vector v2 = new Vector(3,2,1);
            v.GetArea();
            v1.GetArea();
            Console.WriteLine(v == v1);//false
            Console.WriteLine(v != v1);//true
            Console.WriteLine(v1==v2);//false//为什么呢,比较的是地址,所以用运算符重载,改成比较的是值
           Vector v5=new Vector(7,7,7);
            Vector v6= new Vector(8,8,8);
            Vector v4=v5+v6;
            v4.GetArea();
            Console.ReadKey ();

猜你喜欢

转载自blog.csdn.net/weixin_51983027/article/details/129630391