初解C#类、结构、弱引用
一、类
类中的数据和函数称为类的成员
数据成员是包含类的数据----字段、常量和事件的成员。数据成员可以是静态数据、类成员总是实例成员,除非用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#类、结构、弱引用的更多相关文章
- Java中弱引用、软引用、虚引用及强引用的区别
Java中弱引用VS软引用 Java中有如下四种类型的引用: 强引用(Strong Reference) 弱引用(WeakReference) 软引用(SoftReference) 虚引用(Phant ...
- weakref:对象的弱引用
介绍 weakref支持对象的弱引用,正常的引用会增加对象的引用计数,并避免它被垃圾回收.但结果并不是总和期望的那样,比如有时候可能会出现一个循环引用,或者有时候需要内存时可能要删除对象的缓存.而弱引 ...
- java强引用、软引用、弱引用、虚引用
前言概述 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象.这就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,否则就把它扔到垃圾箱,由清洁工人收走 ...
- 弱引用?强引用?未持有?额滴神啊-- Swift 引用计数指导
ARC ARC 苹果版本的自动内存管理的编译时间特性.它代表了自动引用计数(Automatic Reference Counting).也就是对于一个对象来说,只有在引用计数为0的情况下内存才会被释放 ...
- [翻译]Understanding Weak References(理解弱引用)
原文 Understanding Weak References Posted by enicholas on May 4, 2006 at 5:06 PM PDT 译文 我面试的这几个人怎么这么渣啊 ...
- 谈谈.NET中常见的内存泄露问题——GC、委托事件和弱引用
其实吧,内存泄露一直是个令人头疼的问题,在带有GC的语言中这个情况得到了很大的好转,但是仍然可能会有问题.一.什么是内存泄露(memory leak)?内存泄露不是指内存坏了,也不是指内存没插稳漏出来 ...
- weak 弱引用的实现方式
来源:冬瓜争做全栈瓜 链接:https://desgard.com/weak/ 对于 runtime 的分析还有很长的路,最近在写 block 系列的同时,也回顾一下之前疏漏的细节知识.这篇文章是关于 ...
- .NET中常见的内存泄露问题——GC、委托事件和弱引用
一.什么是内存泄露(memory leak)? 内存泄露不是指内存坏了,也不是指内存没插稳漏出来了,简单来说,内存泄露就是在你期待的时间内你程序所占用的内存没有按照你想象中的那样被释放. 因此什么是你 ...
- Java -强引用&弱引用
⑴强引用(StrongReference) 就是通过new得的对象引用 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMe ...
随机推荐
- python 多线程、多进程、协程性能对比(以爬虫为例)
基本配置:阿里云服务器低配,单核2G内存 首先是看协程的效果: import requests import lxml.html as HTML import sys import time impo ...
- Flutter 发布APK时,release版本和debug版本的默认权限不同
Flutter 发布APK时,release版本和debug版本的默认权限不同 @author ixenos 在调试模式下,默认情况下启用服务扩展和多个权限(在flutter中) 当您处于发布模式时, ...
- POJ-2187 Beauty Contest,旋转卡壳求解平面最远点对!
凸包(旋转卡壳) 大概理解了凸包A了两道模板题之后在去吃饭的路上想了想什么叫旋转卡壳呢?回来无聊就搜了一下,结果发现其范围真广. 凸包: 凸包就是给定平面图上的一些点集(二维图包),然后求点集组成的 ...
- JSPatch安全部署
前言 这个事JSPatch集成到客户端的第二篇,第一篇链接:http://www.cnblogs.com/hxwj/p/5163158.html 安全部署链接:http://blog.cnbang.n ...
- angular中ng-repeat去重
[html] view plain copy print?在CODE上查看代码片派生到我的代码片 <div ng-app="myApp" ng-controller=&quo ...
- 生日聚会 BZOJ 1037
生日聚会 [问题描述] 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party. hidadz带着朋友们来到花园中,打算坐成一排玩游戏.为了游戏不至于无聊,就座的方案应满足如下条件: ...
- Unslider--入门篇
Unslider--入门篇 背景:因工作需求,需要完成一个图片轮播效果,因博主不是专业的前端开发人员,so google之,经过挑选最终选择使用Unslider插件完成工作. 一.Unslider插件 ...
- .net面试题汇总一第一篇
1. 简述 private. protected. public. internal 修饰符的访问权限. private:私有成员,只能在类内部中才可以访问. protected:受保护的,只能在该类 ...
- 封装的一个Worker方法,利用线程处理运行时间较长的js代码
function webWorker(targetFile,content){ var promise=new Promise(function(resolve,reject){ var web=ne ...
- mongodb的入门学习
mongodb的入门学习 简介: MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库 ...