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);
}
注意可选参数必须是最后一个参数
C# 读书笔记之类与结构体的更多相关文章
- Go语言学习笔记十: 结构体
Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...
- matlab学习笔记12_3串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields
一起来学matlab-matlab学习笔记12 12_3 结构体 串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields 觉得有用的话 ...
- APUE学习笔记——4.2结构体 struct stat 及其相关函数介绍
以下不少内容来自man手册 结构体struct stat 结构体struct stat用于保存文件相关的所有信息. struct stat的基本成员如下所示 struc ...
- Swift 学习笔记 (类和结构体)
类和结构体是一种多功能且灵活的构造体.通过使用与现存常量 变量 函数完全相同的语法来在类和结构体中定义属性和方法以添加功能. Swift中不需要你为自定义的类和结构体创建独立的结构和实现文件.在Swi ...
- C#学习笔记_12_枚举&结构体
12_枚举&结构体 枚举 是一种数据类型 适用于某些取值范围有限的数据 语法: [访问权限修饰符] enum 枚举名 { 枚举值 } 枚举名遵循大驼峰命名法 枚举一般情况下是和switch c ...
- C#学习笔记05--枚举/结构体
一.枚举 当变量的取值范围是固定的几个时, 就可以使用枚举类型, 这样会更加简洁方便 1.1.定义: 访问修饰符 enum 枚举类型名 { 成员1, 成员2, 成员3, ... } publi ...
- matlab学习笔记12_2创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段
一起来学matlab-matlab学习笔记12 12_2 结构体 创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段 觉得有用的话 ...
- WPF,Silverlight与XAML读书笔记第四十五 - 外观效果之模板
说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘>的编排,对内容进行了总结并加入一些个人理解. 模板允许用任何东西完全替换一个元素的可视树, ...
- WPF,Silverlight与XAML读书笔记第四十八 - Silverlight网络与通讯
说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘>的编排,对内容进行了总结并加入一些个人理解. 这一部分我们重点讨论下Silverlight ...
随机推荐
- C# 显式创建线程 or 使用线程池线程--new Thread() or ThreadPool.QueueUserWorkItem()
在C#多线程编程中,关于是使用自己创建的线程(Thread)还是使用线程池(ThreadPool)线程,一直很困惑,知道看了Jeffrey Richter的相关介绍才明白,记录如下: 当满足一下任何条 ...
- Leetcode-33-Search in Rotated Sorted Array (Hard)
二分查找算法以及旋转之后的数组二分查找算法: #!/usr/local/bin/python3 # -*- coding: utf-8 -*- __author__ = 'author' class ...
- 打印java堆栈信息
使用如下命令: kill -3 {pid} 可以打印指定线程的堆栈信息到tomcat的catalina.out日志中.在性能测试过程中,可以观察响应时间的曲线,如果突然出现波峰则抓取当前时间点tomc ...
- Salesforce自主学习(一)
Salesforce学习--接触Apex: 学习目标: 1.描述出Apex程序语言的关键特点: 2.保存一个Apex类并用另一个Apex类来调用它的方法: 3.使用Developer Console检 ...
- 【IE6的疯狂之八】链接伪类(:hover)CSS背景图片有闪动BUG
IE6下链接伪类(:hover)CSS背景图片有闪动BUG,主要原因ie会再一次请求这张图片,或者说图片没被缓存. 例如: CSS代码 a:hover{background:url(imagepath ...
- IOS 加载网络图片2
//1. NSData dataWithContentsOfURL // [self.icon setImage:[UIImage imageWithData:[NSData dataWithCont ...
- 《C++反汇编与逆向分析技术揭秘》——流程控制语句的识别
if...else...语句 示例: if构成多分支语句 switch 有序线性的switch: 3E82D8位置存放了一个表,标明了要跳转到的地址: 这里的每四字节都标明的是每个case块的首地址: ...
- auDemo
Option Explicit Private Const MODULE_NAME = "auDemo.WSC" Dim oEccomOperation,dbDemo Set oE ...
- Hbase压力测试
PerformanceEvaluation是HBase自带的性能测试工具,该工具提供了顺序读写.随机读写.扫描等性能测试功能.本文简要介绍HBase PerformanceEvaluation的使用方 ...
- 一步步优化JVM三:GC优化基础
本节主要描述关于垃圾回收器性能的三个指标,三个关于垃圾回收器优化的基本原则,以及优化HotSpot VM的垃圾回收器的信息收集,在这些指标中权衡以及信息的收集是非常重要的. 性能指标 吞吐量:衡 ...