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

类的定义形式

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);
}

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

C# 读书笔记之类与结构体的更多相关文章

  1. Go语言学习笔记十: 结构体

    Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...

  2. matlab学习笔记12_3串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields

    一起来学matlab-matlab学习笔记12 12_3 结构体 串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields 觉得有用的话 ...

  3. APUE学习笔记——4.2结构体 struct stat 及其相关函数介绍

    以下不少内容来自man手册 结构体struct stat         结构体struct stat用于保存文件相关的所有信息.         struct stat的基本成员如下所示 struc ...

  4. Swift 学习笔记 (类和结构体)

    类和结构体是一种多功能且灵活的构造体.通过使用与现存常量 变量 函数完全相同的语法来在类和结构体中定义属性和方法以添加功能. Swift中不需要你为自定义的类和结构体创建独立的结构和实现文件.在Swi ...

  5. C#学习笔记_12_枚举&结构体

    12_枚举&结构体 枚举 是一种数据类型 适用于某些取值范围有限的数据 语法: [访问权限修饰符] enum 枚举名 { 枚举值 } 枚举名遵循大驼峰命名法 枚举一般情况下是和switch c ...

  6. C#学习笔记05--枚举/结构体

    一.枚举   当变量的取值范围是固定的几个时, 就可以使用枚举类型, 这样会更加简洁方便   1.1.定义: 访问修饰符 enum 枚举类型名 { 成员1, 成员2, 成员3, ... } publi ...

  7. matlab学习笔记12_2创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段

    一起来学matlab-matlab学习笔记12 12_2 结构体 创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段 觉得有用的话 ...

  8. WPF,Silverlight与XAML读书笔记第四十五 - 外观效果之模板

    说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘>的编排,对内容进行了总结并加入一些个人理解. 模板允许用任何东西完全替换一个元素的可视树, ...

  9. WPF,Silverlight与XAML读书笔记第四十八 - Silverlight网络与通讯

    说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘>的编排,对内容进行了总结并加入一些个人理解. 这一部分我们重点讨论下Silverlight ...

随机推荐

  1. 【Excel】Excel筛选迟点时间的公式

    效果是这样: 方法: 在B列第2排,输入=if(HOUR(A2) >=9,"迟点","") 然后就是复制,粘贴整个列就OK了.不想复制也可以按住的右下角那 ...

  2. mysqldump 备份直接至压缩文件,提高备份及压缩时间

    1.备份及压缩分开 备份mysqldump --single-transaction -hlocalhost --all-databases --triggers --routines --event ...

  3. js中substr,substring,indexOf,lastIndexOf等的用法

    1.substrsubstr(start,length)表示从start位置开始,截取length长度的字符串. var src="images/off_1.png";alert( ...

  4. 关于C#继承运用的总结

    整体代码部分: 解决方案: 父类Person类: using System; using System.Collections.Generic; using System.Linq; using Sy ...

  5. MATLAB ' : ' 官方解释

    1.冒号的作用 产生矢量,阵列标注以及for-loop迭代子 2.描述 冒号是MATLAB中最有用的操作符之一.它使用下述规则来创建有规则的空间矢量: j:k is the same as [j,j+ ...

  6. Spark 源码解读 -- 依赖

    窄依赖 所谓窄依赖就是说子RDD中的每个分区(partition)只依赖于父RDD中有限个数的partition.在API中解释如下: 窄依赖在代码中有两种具体实现,一种是一对一的依赖:OneToOn ...

  7. 洛谷-均分纸牌-NOIP2002提高组复赛

    题目描述 Description 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸 ...

  8. C++友元

    通过friend关键字,我们可以将不属于当前类的一个函数在当前类中加以声明,该函数便可以成为当前类的友元函数. 例1: #include<iostream>using namespace ...

  9. C++把引用作为返回值

    当返回一个引用时,要注意被引用的对象不能超出作用域.所以返回一个对局部变量的引用是不合法的,但是,可以返回一个对静态变量的引用. int& func() { int q; //! return ...

  10. OGC 的WCS WFS 及WMS 服务

    OGC--Open Geospatial Consortium--开放地理信息联盟,是一个非盈利的志愿的国际标准化组织,引领着空间地理信息标准及定位基本服务的发展目前在空间数据互操作领域,基于公共接口 ...