zoukankan      html  css  js  c++  java
  • 一步一步学习C#(三对象和类型)

    1.类和结构

    1 class PhoneCustomer
    2 {
    3 public const string DayOfSendingBill ="Monday";
    4 public int CustomerID;
    5 public string FirstName;
    6 public string LastName;
    7 }
    8  

    结构

    1 struct PhoneCustomerStruct
    2 {
    3 public const string DayOfSendingBill = "Monday";
    4 public int CustomerID;
    5 public string FirstName;
    6 public string LastName;
    7 }
    8  

    类和机构相同点:

    (1)类和结构都是创建对象的模板。

    (2)都可以包含字段和方法。

    (3)都需要用new实例化。

    (4)类中可以初始化非常量字段值,但是结构中不可以初始化非常量字段值。

    (5)结构是值类型,使用结构可以提高性能,类是引用类型

    (6)结构不支持继承

    (7)类要比结构常用得多。

    区别:

    1)结构好像缩小的类。
    2)结构是值类型,不是引用类型。
    3)结构不支持继承。
    4) 结构的构造函数不能无参,无参构造函数是系统默认的。

    类成员:

    (1)类的成员包括数据和函数(方法)。

    (2)类中可以嵌套其它的类型(例如类)。

    (3)public  可以在类的外部直接访问它们     private 只能在类中使用。

    数据成员:

    (1)数据成员叫字段。  

    (2)它必须跟类一起被引用Customer1.FirstName = "Simon";

    (3)定义为public,则可以在外部访问,如果定义为private,或者有const关键字定义,则不可以访问。

    函数成员:

    (1)函数成员就是方法、属性、构造函数、析构函数、运算符、索引器

    (2)构造函数是实例化对象时首先处理的函数。它与所属的类同名,不能有返回类型。一般构造函数用于初始化字段的值。构造函数可以不定义。

    (3)析构函数是销毁对象时调用的。它们的名称也与类相同,但前面有一个~符号。前面不能定义参数。

    2.方法

     (1)在C#中,不存在独立的函数,都必须与类或结构相关,以后我们所要做的函数,其实就是方法了

     用out关键字定义,可以实现ref+不需要初始化的功能。 。

    方法的声名:

    代码
    1 1)用public或private来修饰,定义如下:[modifiers] return_type MethodName([parameters])
    2 {
    3 // Method body
    4   }
    5 2)没有参数要加void,如果有返回值,则要用return return_type_value来返回。
    6 3)例如:
    7 public bool IsSquare(Rectangle rect)
    8 {
    9 return (rect.Height == rect.Width);
    10 }
    11  

    调用方法:

    代码
    1 class MathTest
    2 {
    3 public int value;
    4 public int GetSquare()
    5 {
    6 return value * value;
    7 }
    8 public static int GetSquareOf(int x)
    9 {
    10 return x * x;
    11 }
    12 public static double GetPi()
    13 {
    14 return 3.14159;
    15 }
    16 }
    17 //调用静态函数
    18   Console.WriteLine("Pi is " + MathTest.GetPi());
    19 int x = MathTest.GetSquareOf(5);
    20 Console.WriteLine("Square of 5 is " + x);
    21 //实例化MathTest对象
    22   MathTest math = new MathTest();
    23 //调用非静态函数
    24   math.value = 30;
    25 Console.WriteLine(
    26 "Value field of math variable contains " + math.value);
    27 Console.WriteLine("Square of 30 is " + math.GetSquare());
    28 Console.ReadLine();

    给方法传递参数:

    1.值传递。

    2.引用传递(地址传递)

    代码
    1 首先声明一个方法:
    2  static void SomeFunction(int[] ints, int i)
    3 {
    4 ints[0] = 100;
    5 i = 100;
    6 }
    7 调用它:
    8 int i = 0;
    9 int[] ints = { 0, 1, 2, 4, 8 };
    10 // 显示初始值
    11   Console.WriteLine("i = " + i);
    12 Console.WriteLine("ints[0] = " + ints[0]);
    13 Console.WriteLine("Calling SomeFunction...");
    14 // 在调用方法后,返回值改变,但是i不改变
    15   SomeFunction(ints, i);
    16 Console.WriteLine("i = " + i);
    17 Console.WriteLine("ints[0] = " + ints[0]);
    18 Console.ReadLine();
    19  

    ref 和 out 修饰符:

    ref

    1)默认为值传送
    2)ref关键字将值传送改为引用传送
    static void SomeFunction(int[] ints, ref int i)
    {
    ints[
    0] = 100;
    i
    = 100; //the change to i will persist after SomeFunction() exits
    }
    3)调用时也要加上ref。
    SomeFunction(ints,
    ref i);
    4)传入参数在调用之前必须初始化。

    out

    1 用out关键字定义,可以实现ref+不需要初始化的功能。
    2  

     3.属性

    1 一种特殊的方法:
    2  public string SomeProperty
    3 {
    4 get
    5 {
    6 return "This is the property value";
    7 }
    8 set
    9 {
    10 // do whatever needs to be done to set the property
    11   }
    12 }
    13 实际使用:
    14 mainForm.Height = 400;
    15 //其实是调用了public int Height { set { //…}}
    16  注意:
    17 Get和set访问器都不带参数
    18 Value为赋给ForeName 的值
    19 公共属性第一个字母大写,而私有字段第一个字母小写,有时候会用_foreName来表示。
    20 1)设置只有get的则是只读
    21 2)设置只有set的则是只写
    22 3)可以设置public和private来修改属性
    23

    4.构造函数

    1 public class MyClass
    2 {
    3 public MyClass()
    4 {
    5 }
    6 1)同名
    7 2)没有也可以,系统默认一个
    8 3)可以重载,如:
    9 public MyClass() // zero-parameter constructor
    10 {
    11 // construction code
    12 }
    13 public MyClass(int number) // another overload
    14 {
    15 // construction code
    16 }
    17 1)如果提供了带参数的构造函数,编译器就不会自动提供默认的构造函数
    18 2)使用this关键字区分成员字段和同名的参数。
    19 3)实例化时要带参数
    20 4)构造函数如果定义为private或protected,则不能实例化它
    21
    22
    23 静态构造函数:
    24 class MyClass
    25 {
    26 static MyClass()
    27 {
    28 // initialization code
    29 }
    30 // rest of class definition
    31 }
    32 1 如果没有构造函数,那么会执行默认构造函数在实例化的时候
    33 2 如果访问一个类中的静态成员,那么默认构造函数将不会执行
    34 3 如果类中的构造函数是静态的,那么访问静态成员,构造函数会执行一次,下一次再访问静态成员,则不会执行了
    35

    5.obect类

    1 1)所有的.NET类与类型都派生于System.Object。
    2 其中类都派生于object
    3 而值类型则通过system.valuetype间接派生于system.object。它们的关系是
    4 System.object-system.valuetype-值类型
    5 2)所有的值类型都是结构
    6 3)结构继承于valuetype类,不代表结构可以继承,你自己用就不可以继承,这是微软做的规定。
    7
    8 object类提供的原始方法有:
    9 1)静态的
    10 Equal(object a,object b)
    11 ReferenceEquals(object a,object b)
    12 2.1)非静态公共的
    13 Equal(object a)
    14 GetHashCode()
    15 GetType()
    16 ToString()
    17 2.2)非静态受保护的
    18 Finalize ()
    19 MemberwiseClone()
    20 ToString()方法:获取对象的字符串表示。
    21 GetHash|Code()方法:返回唯一的对象哈希码,这个码是唯一的。
    22 Equals()(两个版本)和ReferenceEquals()方法:比较两个类的实例是否相同,在运算符重载时讲解。
    23 Finalize()方法:析构函数调用的方法。
    24 GetType()方法:返回从System.Type派生的类的一个实例。是反射技术的入口。
    25 MemberwiseClone()方法:对象的浅复制(阴影复制)
    26
    27 备注中的代码演示了这几个方法的使用
    28 Object对象还提供了继承类可以对三个方法的重写
    29 见备注中的代码
    30

    代码:

    代码
    1 class Program:object
    2 {
    3
    4 static void Main(string[] args)
    5 {
    6 Money cash1 = new Money();
    7 cash1.Amount = 40M;
    8 Console.WriteLine("cash1.ToString() returns: " + cash1.ToString());
    9 Money cash2 = cash1;
    10 Console.WriteLine("因为改写了equals方法,所以返回值永远是false " + cash1.Equals(cash2));
    11 Console.WriteLine("因为改写了gethashcode方法,所以返回值永远是 " + cash1.GetHashCode());
    12 Console.ReadLine();
    13
    14 }
    15
    16 }
    17
    18 class Money
    19 {
    20 private decimal amount;
    21 public decimal Amount
    22 {
    23 get
    24 {
    25 return amount;
    26 }
    27 set
    28 {
    29 amount = value;
    30 }
    31 }
    32 public override string ToString()
    33 {
    34 return "$" + Amount.ToString();
    35 }
    36 public override bool Equals(object obj)
    37 {
    38 //return base.Equals(obj);
    39 return false;
    40 }
    41 public override int GetHashCode()
    42 {
    43 return 1;
    44 //return base.GetHashCode();
    45 }
    46 }
    47
  • 相关阅读:
    problems_springmvc
    skills_eclipse
    problems_azkaban
    CentOS7与CentOS6的不同
    2021暑期cf加训2
    2021牛客暑期多校训练营4
    2021牛客暑期多校训练营3
    2021暑期cf加训1
    2021牛客暑期多校训练营2
    10.git rm 移除文件
  • 原文地址:https://www.cnblogs.com/MR_ke/p/1677166.html
Copyright © 2011-2022 走看看