HOME
BLOG
自我补充(1)
9月 21 2022

get 方法和 set 方法

面向对象编程(OOP) 中,是不允许外界直接对 类的成员变量 直接访问的,既然不能访问,那定义这些成员变量还有什么意义呢?所以 C# 中就要用 set和get方法 来访问私有成员变量,它们相当于外界访问对象的一个通道,一个“接口”。

先来看一段代码:

class Employee
  {
        private string name;
        private byte age;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public byte Age
        {
            get { return age; }
            set { age = value; }
        }
  }

代码中定义了两个私有变量 name 和 age ,当我们不想让外界随意访问该私有变量时,可以使用属性来访问,语法为:

public < 返回类型(要与被访问变量的类型相同)> < 属性名(不能与被访问变量同名)>
  {
        get{ return <被访问变量>; }
        set{ <被访问变量> = value; }
  }

当我们使用属性来访问私有成员变量时就会调用里面的get方法,当我们要修改该变量时就会调用set方法,当然在定义的时候可以只定义一个get方法或只定义一个set方法。

如果只定义get方法,那么这个相应变量就是 “只读” 的;如果只定义set方法,那么相应变量就是 “只写” 的。

既然外界可以通过 set和get 访问类内私有成员,那为什么不直接把它定义成共有,直接供外界访问呢?拿上面的Employee类来说明:

class Employee
    {
        private string name;
        private byte age;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        //****修改后****↓↓↓↓↓↓↓↓
        public byte Age
        {
            get { return age; }  
            set
            {                
                if (value > 10 && value<=100)   //一般在公司雇员的年龄都在10到100岁之间
                age = value;   
            }
        }
        //****修改后****↑↑↑↑↑↑↑↑
    }

上例中,set就像一位门卫大叔一样,只有好人才能进来。可以通过属性来控制对员变量的读写,防止对成员变量的非法赋值等。

再举个小例子,以下是个温度计的类:

class Thermometer
    {
        private double temperature;
        public Thermometer(double temperature)  //构造函数
        {
            this.temperature = temperature;
        }
        public double Temperature
        {
            get { return temperature; }
            set { temperature = value; }
        }
    }

假设这里的温度单位表示的是摄氏度(℃),如果在需求分析阶段误解了客户的原始意愿或者客户在日后变更了需求,需要把系统中所有表示温度的变量temperature都用来表示开尔文温度(K)。那么不必动系统中成百上千个Temperature属性,只需在get和set函数中稍微修改一下代码即可:

class Thermometer
    {
        private double temperature;
        public Thermometer(double temperature)  //构造函数
        {
            this.temperature = temperature;
        }
        public double Temperature
        {
            //****修改后****↓↓↓↓↓↓↓↓
            get { return temperature-273.15; }
            set { temperature = value+273.15; }
            //****修改后****↑↑↑↑↑↑↑↑
        }
    }

建一个控制台应用程序来测试一下,主函数为:

class Test
    {
        static void Main(string[] args)
        {
            Thermometer a = new Thermometer(40);
            Console.WriteLine(a.Temperature);
        }
    }

上面代码中用构造函数给温度设的初值为40度,代码修改前运行结果为“40”,代码修改后运行结果为“-233.15”。

get、set 用法特点如下:

  • 一则是隐藏组件或类内部的真是成员;

  • 二是用来建立约束的,比如,实现“有我没你”这种约束;

  • 三是用来响应属性变化事件,当属性变化是做某事,只要写在set方法里就行;

当想读出或写入属性的值时,存取标志限定了被实现的语句。

用于读出属性的值的存取标志记为关键字get,而要修改属性的值的读写符标志记为set。


在C#中,类的成员包括常量、字段、属性、方法、构造函数、索引器、事件等。

其中,常量、字段和属性都是类的数据有关的成员,经常被称为数据成员。

方法提供针对数据的逻辑处理。

构造函数在创建对象时用来初始化字段成员。


字段:一般为私有的,不对外开放

属性:一般为公有的,作为外部访问对应字段的一个接口


相关链接:C#中的set和get方法 - 细胞的理想 - 博客园 (cnblogs.com)

相关链接:C#中的set和get方法_wh123asd的博客-CSDN博客

相关链接:C#中{get;set;}鱼糕鱼糕的博客-CSDN博客{ get; set; }


常见用法

8好意思,经典记不住单词意思=.=)

名称 直译 作用(浅显)
IndexOf 指数、索引等 跟数组下标值有关
Reverse 反向 反向
Sort 排序 按一定规律顺序
Concat 合并 合并多个数组;合并多个字符串
Split 分裂 大致分隔符作用吧
Trim 修剪 但好像更多用在清除空格
Append 附加 在末尾追加
Count 一般前面会是int index,index为开始索引位置,count为从index开始获取元素的个数;(有点类似Length?不是直接使用,可以配合print)
Intersect 相交 IntersectWith 交集
Union 联盟 UnionWith 并集
Except 除了 ExceptWith 差集
Symmetric 对称 SymmetricExceptWith 对称差集
Parameter 参数

关于属性和方法

属性(Property)

是类(class)/结构(structure)/接口(interface)的命名(named)成员。类或结构中的成员变量或方法称为 域(Field)

属性(Property)是域(Field)的扩展,且可使用相同的语法来访问。它们使用 访问器(accessors) 让私有域的值可被读写或操作。

属性(Property)的 访问器(accessor) 包含有助于获取(读取或计算)或设置(写入)属性的可执行语句。访问器(accessor)声明可包含一个 get 访问器、一个 set 访问器,或者同时包含二者。

如下一个实例:

using System;
namespace runoob
{
   class Student
   {
      private string code = "N.A";
      private string name = "not known";
      private int age = 0;

      // 声明类型为 string 的 Code 属性
      public string Code
      {
         get
         {
            return code;
         }
         set
         {
            code = value;
         }
      }
      // 声明类型为 string 的 Name 属性
      public string Name
      {
         get
         {
            return name;
         }
         set
         {
            name = value;
         }
      }
      // 声明类型为 int 的 Age 属性
      public int Age
      {
         get
         {
            return age;
         }
         set
         {
            age = value;
         }
      }
      public override string ToString()
      {
         return "Code = " + Code +", Name = " + Name + ", Age = " + Age;
      }
    }
    class ExampleDemo
    {
      public static void Main()
      {
         // 创建一个新的 Student 对象
         Student s = new Student();

         // 设置 student 的 code、name 和 age
         s.Code = "001";
         s.Name = "Zara";
         s.Age = 9;
         Console.WriteLine("Student Info: {0}", s);  //Debug.Log(s.ToString());
         // 增加年龄
         s.Age += 1;
         Console.WriteLine("Student Info: {0}", s);
         Console.ReadKey();
       }
   }
}

方法(method)

一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块。每一个 C# 程序至少有一个带有 Main 方法的类。

要使用一个方法,您需要:

  • 定义方法

  • 调用方法

当定义一个方法时,从根本上说是在声明它的结构的元素。在 C# 中,定义方法的语法如下:

<Access Specifier> <Return Type> <Method Name>(Parameter List)
{
   Method Body
}
  • Access Specifier:访问修饰符,这个决定了变量或方法对于另一个类的可见性。
  • Return type:返回类型,一个方法可以返回一个值。返回类型是方法返回的值的数据类型。如果方法不返回任何值,则返回类型为 void
  • Method name:方法名称,是一个唯一的标识符,且是大小写敏感的。它不能与类中声明的其他标识符相同。
  • Parameter list:参数列表,使用圆括号括起来,该参数是用来传递和接收方法的数据。参数列表是指方法的参数类型、顺序和数量。参数是可选的,也就是说,一个方法可能不包含参数。
  • Method body:方法主体,包含了完成任务所需的指令集。

C# 的程序结构

一个 C# 程序主要包括以下部分:

  • 命名空间声明(Namespace declaration)
  • 一个 class
  • Class 方法
  • Class 属性
  • 一个 Main 方法
  • 语句(Statements)& 表达式(Expressions)
  • 注释

C# 文件的后缀为 .cs

以下创建一个 test.cs 文件,文件包含了可以打印出 “Hello World” 的简单代码:

using System;
namespace HelloWorldApplication
{
   class HelloWorld
   {
      static void Main(string[] args)
      {
         /* 我的第一个 C# 程序*/
         Console.WriteLine("Hello World");
         Console.ReadKey();
      }
   }
}

让我们看一下上面程序的各个部分:

  • 程序的第一行 using System; using 关键字用于在程序中包含 System 命名空间。一个程序一般有多个 using 语句。

  • 下一行是 namespace 声明。一个 namespace 里包含了一系列的类。HelloWorldApplication 命名空间包含了类 _HelloWorld_。

  • 下一行是 class 声明。类 HelloWorld 包含了程序使用的数据和方法声明。类一般包含多个方法。方法定义了类的行为。在这里,HelloWorld 类只有一个 Main 方法。

  • 下一行定义了 Main 方法,是所有 C# 程序的 入口点Main 方法说明当执行时 类将做什么动作。

  • 下一行 /*...*/ 将会被编译器忽略,且它会在程序中添加额外的 注释

  • Main 方法通过语句 Console.WriteLine("Hello World"); 指定了它的行为。

    WriteLine 是一个定义在 System 命名空间中的 Console 类的一个方法。该语句会在屏幕上显示消息 “Hello World”。

  • 最后一行 Console.ReadKey(); 是针对 VS.NET 用户的。这使得程序会等待一个按键的动作,防止程序从 Visual Studio .NET 启动时屏幕会快速运行并关闭。


C# 关键字

| 保留关键字(Reserved Keywords):

关键字
abstract as base bool break byte case
catch char checked class const continue decimal
default delegate do double else enum event
explicit extern false finally fixed float for
foreach goto if implicit in in (generic modifier) int
interface internal is lock long namespace new
null object operator out out (generic modifier) override params
private protected public readonly ref return sbyte
sealed short sizeof stackalloc static string struct
switch this throw true try typeof uint
ulong unchecked unsafe ushort using virtual void
volatile while

| 上下文关键字(Contextual Keywords):

关键字
add alias ascending descending dynamic from get
global group into join let orderby partial (type)
partial (method) remove select


内容取自世界各地.
👾 - Morikiiii - 👾

C# Study