一、类

类中的数据和函数称为类的成员

数据成员是包含类的数据----字段、常量和事件的成员。数据成员可以是静态数据、类成员总是实例成员,除非用static进行显示的声明。

事件是类的成员,在发生某些行为(如改变类的字段或属性,或者进行了某种形式的用户交互操作)时,他可以让对象通知调用方,调用方可以包含所谓“事件处理程序”的代码来响应该事件。

函数成员提供了操作类中数据的某些功能,包括方法、属性、构造函数和终结器(finalizer)、运算符以及索引器。

(1)方法是与某个类相关的函数,与数据成员一样,函数成员默认为实例,使用static修饰符可以把方法定义为静态方法

(2)属性是可以从客户段访问的函数组,其访问方式与访问类的公共字段类似。C#为读写类中的属性提供了专用语法,所以不必使用那些名称中嵌有Get或Set的方法。因为属性的这种语法不同于一般函数的语法,在客户端代码中,虚拟的对象被当作实际的东西

(3)构造函数是在实例化对象时自动调用的特殊函数,它们必须与所属的类同名,且不能有返回类型。构造函数用于初始化字段的值

(4)终结器类似构造函数,但是在CLR检测到不再需要某个对象时调用它,它们的名称与类相同,但前面有一个“~”符号,不可能预测什么时候调用终结器

(5)运算符执行最简单的操作就是加法和减法,C#还允许运算符重载

如下是一个包含静态构造函数和索引的类的定义和测试

 class Program
{
static void Main(string[] args)
{
Console.WriteLine(UserPreferences.BackColor);
var testUserPreference = new UserPreferences();
Console.WriteLine(UserPreferences.BackColor);
try
{
Console.WriteLine(testUserPreference["Sun"]);
}
catch (ArgumentOutOfRangeException e)
{
Console.WriteLine(e.Message);
}
Console.ReadKey();
}
} public class UserPreferences
{
//用于测试当提供类的静态构造函数之后类的静态字段不会随实力初始化而改变,当然也可以直接给变量赋初始值
public static string BackColor;
public static int Version;
public int Age { get; set; }
public string Name { get; set; }
static UserPreferences()
{
var dtTime = DateTime.Now;
if (dtTime.DayOfWeek.Equals(DayOfWeek.Saturday) || dtTime.DayOfWeek.Equals(DayOfWeek.Sunday))
BackColor = "Green";
else
BackColor = "Red";
}
string[] days = { "Sun", "Mon", "Tues", "Web", "Thurs", "Fri", "Sat" }; //串联构造函数
public UserPreferences()
{ }
public UserPreferences(int age) : this(age, "")
{ }
public UserPreferences(string name) : this(, name) { }
public UserPreferences(int age, string name)
{
if (age > ) Age = ;
else Age = age;
Name = name;
}
public int this[string day]
{
get { return GetDay(day); }
}
/// <summary>
/// 定义索引器获取数据的方法
/// </summary>
/// <param name="testDay"></param>
/// <returns></returns>
private int GetDay(string testDay)
{ for (int j = ; j < days.Length; j++)
{
if (days[j] == testDay)
{
return j;
}
} throw new ArgumentOutOfRangeException(testDay, "testDay must be in the form \"Sun\", \"Mon\", etc");
}
}

从中可以得出静态构造函数的特性:一个类(结构)只能定义一个静态构造函数,静态构造函数不允许访问修饰符并且不能接受任何参数,无论创建多少个类实例,静态函数知执行一次、CLR创建类实例或首次调用类静态成员前,CLR会调用静态构造函数、静态构造函数先于实例级别的其他构造函数执行。参考https://msdn.microsoft.com/en-us/library/2549tw02.aspx

二,结构

结构是值类型,不是引用类型。它们存储在栈中或存储未内联,其生存期的限制和简单的数据类型一样,对于结构:不支持继承,编译器总是提供一个无参的默认构造函数,并且不允许替换,使用结构可以指定字段如何在内存中布局,默认的构造函数把数值初始化为0,把引用类型初始化为null,且总是隐式指出的,如下定义的结构:

 struct Dimensions
{
public double Length;
public double Width;
public Dimensions(double length, double width):this()
{
Length = length;
Width = width;
}
}

三、弱引用

弱引用允许创建和使用对象,但是GC运行时就会回收对象并释放内存,当object比较大时运用弱引用是合理的,如下:

   WeakReference userReference = new WeakReference(new UserPreferences(, "yoyo"));
UserPreferences userModel;
if (userReference.IsAlive)
{
userModel = userReference.Target as UserPreferences;
Console.WriteLine(userModel.Age);
}

在弱引用创建时,会向其构造函数传递一个新的引用对象,在要重新访问对象是必须通过IsAlive属性来判断对象是否被GC回收,如果被回收的话要重新创建。

初解C#类、结构、弱引用的更多相关文章

  1. Java中弱引用、软引用、虚引用及强引用的区别

    Java中弱引用VS软引用 Java中有如下四种类型的引用: 强引用(Strong Reference) 弱引用(WeakReference) 软引用(SoftReference) 虚引用(Phant ...

  2. weakref:对象的弱引用

    介绍 weakref支持对象的弱引用,正常的引用会增加对象的引用计数,并避免它被垃圾回收.但结果并不是总和期望的那样,比如有时候可能会出现一个循环引用,或者有时候需要内存时可能要删除对象的缓存.而弱引 ...

  3. java强引用、软引用、弱引用、虚引用

    前言概述 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象.这就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,否则就把它扔到垃圾箱,由清洁工人收走 ...

  4. 弱引用?强引用?未持有?额滴神啊-- Swift 引用计数指导

    ARC ARC 苹果版本的自动内存管理的编译时间特性.它代表了自动引用计数(Automatic Reference Counting).也就是对于一个对象来说,只有在引用计数为0的情况下内存才会被释放 ...

  5. [翻译]Understanding Weak References(理解弱引用)

    原文 Understanding Weak References Posted by enicholas on May 4, 2006 at 5:06 PM PDT 译文 我面试的这几个人怎么这么渣啊 ...

  6. 谈谈.NET中常见的内存泄露问题——GC、委托事件和弱引用

    其实吧,内存泄露一直是个令人头疼的问题,在带有GC的语言中这个情况得到了很大的好转,但是仍然可能会有问题.一.什么是内存泄露(memory leak)?内存泄露不是指内存坏了,也不是指内存没插稳漏出来 ...

  7. weak 弱引用的实现方式

    来源:冬瓜争做全栈瓜 链接:https://desgard.com/weak/ 对于 runtime 的分析还有很长的路,最近在写 block 系列的同时,也回顾一下之前疏漏的细节知识.这篇文章是关于 ...

  8. .NET中常见的内存泄露问题——GC、委托事件和弱引用

    一.什么是内存泄露(memory leak)? 内存泄露不是指内存坏了,也不是指内存没插稳漏出来了,简单来说,内存泄露就是在你期待的时间内你程序所占用的内存没有按照你想象中的那样被释放. 因此什么是你 ...

  9. Java -强引用&弱引用

    ⑴强引用(StrongReference) 就是通过new得的对象引用 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMe ...

随机推荐

  1. webforms字典参数处理

    当webforms参数中的value是一个字典时,加上‘’即可正常传参.

  2. vmware安装CentOS " Intel VT-x 处于禁用状态"

    我刚用虚拟机vmware 11安装CentOS 7 ,出现错误“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题,如下图. Intel VT-x 即Virtualiza ...

  3. 2017 ACM/ICPC Asia Regional Shenyang Online

    cable cable cable Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. Azure Storage Blob文件重命名

    Azure Storage的SDK并没有提供文件重命名的方法,而且从StorageExplorer管理工具里操作修改文件名的时候也有明确提示: 是通过复制当前文件并命名为新文件名再删除旧文件,不保存快 ...

  5. heartbeat负载均衡详解

    heartbeat高可用软件http://www.linux-ha.org/wiki/Main_Page 1 heartbeat作用通过heartbeat将资源(IP)从一台已经故障的计算机快速转移到 ...

  6. UITableView点击切换状态分析

    原理:多选+点击动画 初始化和点击都调用的方法 - (void)changeStateAnimated:(BOOL)animated { //不需要动画,初始化的时候 if (animated == ...

  7. 解决安卓SDK更新dl-ssl.google.com无法连接的方法

    Q:解决安卓SDK更新dl-ssl.google.com无法连接的方法: A1.修改C:\windows\system32\dirvers\etc\hosts文件,将其复制到其他地方修改后替换回原来的 ...

  8. 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】

    刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...

  9. Oracle常用操作【自己的练习】

    Oracle查询的时候条件要用单引号包裹,不能用双引号;Oracle的in子查询里面的值最多有1000个........ 连接orcl数据库 C:\Windows\system32@orcl as s ...

  10. Codeforces Round #287 (Div. 2) E. Breaking Good [Dijkstra 最短路 优先队列]

    传送门 E. Breaking Good time limit per test 2 seconds memory limit per test 256 megabytes input standar ...