一、类

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

数据成员是包含类的数据----字段、常量和事件的成员。数据成员可以是静态数据、类成员总是实例成员,除非用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. map 插入数据的方式局别

    #include<map> #include<iostream> usingnamespace std; int main() { map <int, int> m ...

  2. OSPF 提升 一 ----基础

    ospf  ccnp内容   一  link-state protocols      IGP   开放式的最短路径优先协议     公有协议 支持中到大型的网络    spf算法 链路状态协议 1. ...

  3. Working out (DP)

    Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to look hot at the ...

  4. 优化代码,引发了早期缺陷导致新bug

    早期系统有个缺陷,调用js时少提交一个参数,导致该参数一直是undefined,但是不会引起bug. 对系统进行优化后,这个参数变成了必要的,然后代码一直会走else,undefined值明显不是一个 ...

  5. HDU-4849 Wow! Such City!,最短路!

    Wow! Such City!    题意:题面很难理解,幸亏给出了提示,敲了一发板子过了.给出x数组y数组和z数组的求法,并给出x.y的前几项,然后直接利用所给条件构造出z数组再构造出C数组即可,C ...

  6. mac安装R语言启动后-Warning messages

    During startup - Warning messages: : Setting LC_CTYPE failed, using "C" : Setting LC_COLLA ...

  7. 【bzoj3696】化合物 树形dp

    题目描述 首长NOI惨跪,于是去念文化课了.现在,他面对一道化学题.这题的来源是因为在一个奇怪的学校两个化竞党在玩一个奇怪的博弈论游戏.这个游戏很蛋疼,我相信你们也没有兴趣听.由于这个游戏涉及博弈论, ...

  8. leetcode 350

    找两个数组的交叉部分,可以用map进行标记 首先对第一个数组进行记录,第二个数组在第一个数组记录基础上进行判断,如果在第一个数组出现过,就记录 class Solution { public: vec ...

  9. response.sendRedirect()使用注意事项

    用response.sendRedirect做转向其实是向浏览器发送一个特殊的Header,然后由浏览器来做转向,转到指定的页面,所以用sendRedirect时,浏览器的地址栏上可以看到地址的变化. ...

  10. Android 瘦身之道

    Android 瘦身之道 ---- so文件 [TOC] 1. 前言 目前Android 瘦身只有几个方面可以入手,因为apk的结构就已经固定了. res 目录下的资源文件.(通常是压缩图片,比如 矢 ...