一、类

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

数据成员是包含类的数据----字段、常量和事件的成员。数据成员可以是静态数据、类成员总是实例成员,除非用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. pytorch中torch.unsqueeze()函数与np.expand_dims()

    numpy.expand_dims(a, axis) Expand the shape of an array. Insert a new axis that will appear at the a ...

  2. HDU-4612 Warm up,tarjan求桥缩点再求树的直径!注意重边

    Warm up 虽然网上题解这么多,感觉写下来并不是跟别人竞争访问量的,而是证明自己从前努力过,以后回头复习参考! 题意:n个点由m条无向边连接,求加一条边后桥的最少数量. 思路:如标题,tarjan ...

  3. Tsinsen 1485 Catch The Penguins 抓企鹅 ——Bitset

    [题目分析] 刚开始想的是KD-Tree去暴力求解. 写了半天还没有暴力得的分数多(说好的nlogn呢) 直接按照四个维度排序. 然后扫一遍,用bitset去维护,然后对于四个维度小于一个询问的结果取 ...

  4. bzoj2748 [HAOI2012]音量调节 背包

    Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改 ...

  5. JSON与字符串互相转换的几种方法

    1 2 3 4 5 6 7 8 字符串转对象(strJSON代表json字符串)   var obj = eval(strJSON);   var obj = strJSON.parseJSON(); ...

  6. Nk 1214 Relatives(欧拉函数)

    Time Limit: 1500 ms    Memory Limit: 10000 kB   Total Submit : 234 (77 users)   Accepted Submit : 10 ...

  7. Mato的文件管理(bzoj 3289)

    Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是加密过的,只能用Mato自己写的程序才能 ...

  8. 洛谷 [P3834] 可持久化线段树(主席树)

    主席树可以存储线段树的历史状态,空间消耗很大,一般开45n即可 #include <iostream> #include <cstdio> #include <cstri ...

  9. python--爬取http://www.kuaidaili.com/并保存为xls

    代码如下: 复制在python3上先试试吧^_^ # -*- coding: utf-8 -*- """ Created on Mon Jun 12 13:27:59 2 ...

  10. kail Linux 安装Parallels Tools

    网上好多都是Parallels8的 针对Parallels 9 的还真不好找..... 自己捣鼓了一阵 终于可以安装了,但还是有错误,因为公司网络太不给力....回家再测试吧 1.在桌面新建一个文件夹 ...