zoukankan      html  css  js  c++  java
  • C# 读书笔记之类与结构体

    类和结构体都包括数据和操作数据的方法

    类的定义形式

    class PhoneCustomer
    {
    public const string DayOfSendingBill = "Monday";
    public int CustomerID;
    public string FirstName;
    public string LastName;
    }

    结构体和类的区别在于:结构体是在内存中存储和访问的(类是引用类型存储在托管堆中,结构体是值类型存储在栈中,不支持继承)

    结构体的定义形式如下:

    struct PhoneCustomerStruct
    {
    public const string DayOfSendingBill = "Monday";
    public int CustomerID;
    public string FirstName;
    public string LastName;
    }

    实例化的时候都需要使用new关键字,形式如下:

    PhoneCustomer myCustomer = new PhoneCustomer(); // works for a class
    PhoneCustomerStruct myCustomer2 = new PhoneCustomerStruct();// works for a struct

    完整的结构体定义形式如下

    struct Dimensions
    {
       public double Length;
       public double Width;
      public Dimensions(double length, double width)  //构造函数
      {
          Length = length;
          Width = width;
      }
    }

    结构体通常用在一些小的数据类型,因为其性能方面比类要好。当然struct不支持继承

    一、引用类型和值类型的传递

    引用类型传递的是对象的引用有点像C++的指针,值类型完完全全传递的是值类型的副本,在内存中拥有自己的内存空间。

    在C#中一般情况下,引用类型将通过引用进行传递,值类型将通过值的形式进行传递值得注意的是:C# 中string是引用类型,但它和传统的引用又有不同之处

                string str1 = "hello";
                string str2 = str1;
                str2 = "tian";
                System.Diagnostics.Debug.WriteLine(str1);
                System.Diagnostics.Debug.WriteLine(str2);

    按照正规的引用类型分析两个输出都将是"tian"

    但实际情况并不是这样这是因为str2 = "tian";并没有在替换原来堆上的对象,而是在堆上又新建了一个对象,并把该对象的引用赋给了str2

    此时对str2的赋值并不会影响到str1

    其输出的结果为

    hello

    tian

    二、如何让值类型通过引用类型传递呢?

    ref 参数可以实现

    static void SomeFunction(int[] ints, ref int i)
    {
    ints[0] = 100;
    i = 100; // The change to i will persist after SomeFunction() exits.
    }

    SomeFunction(ints, ref i)

    此时i的传递将会通过引用的形式,在方法中任何对i的改动,都将会影响最原始的i值。

    out参数也是通过引用的形式进行传递的

    static void SomeFunction(out int i)
    {
    i = 100;
    }
    public static int Main()
    {
    int i; // note how i is declared but not initialized.
    SomeFunction(out i); //在调用的时候也别忘了添加out参数哦
    Console.WriteLine(i);
    return 0;
    }

    Named参数

    通常情况下调用方法时参数的传递都要讲究顺序,但是通过named参数你可以使用任何顺序

    string FullName(string firstName, string lastName)
    {
    return firstName + " " + lastName;
    }

    FullName("John", "Doe");
    FullName(lastName: "Doe", firstName: "John");

    这两个调用将输出同样的结果

    Optional参数

    可选参数

    void TestMethod(int optionalNumber , int notOptionalNumber = 10)
    {
    System.Console.Write(optionalNumber + notOptionalNumber);
    }

    注意可选参数必须是最后一个参数

  • 相关阅读:
    weblogic.xml 精妙设置
    mysql --> select * from Employee group by name这样的语法有什么意义?
    oracle pctfree和pctused详解
    超详细 SpringMVC @RequestMapping 注解使用技巧
    Spring 注解概览
    Js替换字符串中的所有空格
    面试题精选
    Axure RP Extension for Chrome修复
    【javascript】获取 格式化时间
    万能清除浮动
  • 原文地址:https://www.cnblogs.com/tianmochou/p/4964052.html
Copyright © 2011-2022 走看看