C#学习笔记 ----对象和类型

类和结构

类是存储在堆(heap)上的引用类型,而结构是存储在栈(stack)上的值类型。

结构 不支持继承

数据成员 是包含类的数据--字段、常量和事件的成员。

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

ref参数 迫使值参数通过引用传递给方法

在方法的输入参数前面加上out前缀时,传递给该方法的变量可以不初始化。

命名参数允许按照任意顺序传递

参数也可以是可选的。必须为可选参数提供默认值。

方法重载:

.俩个方法不能仅在返回类型上有区别

.俩个方法不能仅根据参数是声明为ref还是out来区分

属性

在属性定义中省略set访问器,就可以创建只读属性

在属性定义中省略get访问器,就可以创建只写属性

C#允许给属性的set和get访问器设置不同的访问修饰符,属性可以有公有的get访问器和私有或受保护的set访问器

如果属性的set和get访问器中没有任何逻辑,就可以使用自动实现的属性。

构造函数

注意,如果提供了带参数的构造函数,编译器就不会自动提供默认的构造函数。

可以把构造函数定义为private 或protected,这样不相关的类也不能访问,

这在下面俩种情况下是有用的:

.类仅用作某些静态成员或属性的容器,因此永远不会实例化它

.希望类仅通过调用某个静态成员函数来实例化(这就是所谓对象实例化的类工厂方法)

静态构造函数,类有一些静态字段或属性,需要在第一次使用之前,从外部源中初始化这些静态字段和属性

C#构造函数初始化器可以包含对同一个类的另一个构造函数的调用,也可以包含对直接基类的构造函数的调用(使用相同的语法,应使用base关键字代替this)

只读字段

readonly

可以在构造函数中给只读字段赋值,但不能在其他地方赋值

public class Document
{
    public readonly DateTime CreationData

    public Document()
    {
        // Read in creation date from file.Assume result is 1 Jan 2002
        // but in general this can be different for different instances
        // of the class
        CreationDate = new DateTime(2002,1,1);
    }
}            

匿名函数

var与new 关键字一起使用,可以创建匿名类型

如下:

var caption = new {FirstName = "James", MiddleName = "T",LastName = "Kirk"};

结构

正面影响:为结构分配内存时,速度非常快,因为它们将内联或者保存在栈中。在结构超出了作用域被删除时,速度也很快。

负面影响:只要把结构作为参数来传递或者把一个结构赋予另一个结构,结构的所有内容就被复制,而对于类则只复制引用。

结构的继承链:每个结构派生自System.ValueType类,System.ValueType类又派生自System.Object。

默认构造函数把数值字段都初始化为0,把引用类型字段初始化为null,且总是隐式地给出。

部分类

partial关键字允许把类、结构或接口放在多个文件中

partial关键字的用法是:把partial放在class、struct或interface关键字前面

扩展方法,它允许改变一个类,但不需要该类的源代码。

时间: 2024-10-02 09:59:34

C#学习笔记 ----对象和类型的相关文章

C# in Depth Third Edition 学习笔记-- 可空类型

1. 没有值怎么办? 客户下了一份订单,有订货日期,但尚未发货,但没有发货日期,怎么表述发货日期? C#2以后使用可空类型. 2. 为什么值类型的变量不能是null? 引用类型变量,其值是一个引用,即一个非空引用值提供了访问一个对象 的途径,对于null来说,作为一个特殊值,意味着不引用任何对象.所有引用的默认值都为null,内存中表示全零. 值类型变量,其值是它本身的真实数据.null不是有效的值类型的值. 3. C#1 解决不存在可空值类型 魔值:DateTime,牺牲公元元年中的某个值Da

[Java学习笔记]对象克隆

对象克隆: 浅克隆: 被克隆的对象中的值类型数据被复制一份新值,但是引用的对象只被复制其引用传递给新克隆出来的对象 深克隆: 被克隆的对象中的值类型数据被复制一份新值,并且其中引用的对象会重新创建新的对象,把新对象的引用传递给新克隆出来的对象 Java中实现克隆: Java中Object中定义了clone方法,默认为浅克隆操作,即你只是简单super.clone得到的结果是浅克隆的结果,如果需要深克隆,则需要实现Cloneable接口,并且重写clone方法 查看Java源代码发现Object中

初探swift语言的学习笔记(可选类型?和隐式可选类型!)

可选类型.隐式可选类型 其次swift还引入一个较有趣的初始值设置语法使用"?"操作符及"!"号操作符 如:"var optionalString: String? = "Hello" optionalString == nil var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = op

Swift学习笔记(二)参数类型

关于参数类型,在以前的编程过程中,很多时间都忽视了形参与实参的区别.通过这两天的学习,算是捡回了漏掉的知识. 在swift中,参数有形参和实参之分,形参即只能在函数内部调用的参数,默认是不能修改的,如果想要修改就需要在参数前添加var声明. 但这样的声明过后,仍旧不会改变实参的值,这样就要用到inout了,传递给inout的参数类型必须是var类型的,不能是let类型或者字面类型,(字面类型是在swift中常提的一个术语,个人认为就是赋值语句,也不能修改)而且在传递过程中,要用传值符号"&

MySQL学习笔记之三 表类型

你能用的数据库引擎取决于MySQL在安装时候是如何被编译的.要添加一个新的引擎,就必须编译MySQL.仅仅为了添加一个特性而编译应用程序的想法对于Windows的开发人员来说可能有点小题大做,得不偿失,但是在Unix的世界里,这已经成为了标准.在缺省的情况下,MySQL支持三个引擎:ISAM.MyISAM和HEAP.另外两种类型InnoDB和Berkley(BDB),也常常可以使用. ISAM ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之初就考虑到数据库被查询的次数远远大于

JavaScript 学习笔记 - 对象和继承

本文是JavaScript The Good Part 有关对象和继承的学习笔记. 1. Object.create 本函数是ECMAScript 5中的标准函数,其作用是用一个对象作为原型来生成另一个对象,可以用以下的code 模拟实现. if(typeof Object.create !== 'function') { Object.create = function(proto){ var F = function(){}; if(typeof proto !== 'object'){ /

C# 指针学习笔记之指针类型

大学的时候学过C++.C,最近工作也不是很忙,就想起看看C#中的指针,看看.回忆一下啊,指针的用法,以下学习笔记摘自msdn:指针类型 在不安全的上下文中,类型可以是指针类型以及值类型或引用类型.指针类型声明具有下列形式之一: type* identifier; void* identifier; //allowed but not recommended 下列类型都可以是指针类型: sbyte.byte.short.ushort.int.uint.long.ulong.char.float.d

C#学习笔记二: C#类型详解

前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. 再会有三篇博客  这个系列的就会结束了. 也算是自己对园子中@Learning Hard出版的<<C#学习笔记>>的一个总结了. 博客内容基本上都是白天抽空在公司写好的了, 但是由于公司内部网络不能登录博客园所以只能够夜晚拿回来修改,  写的不好或者不对的地方也请各位大神指出. 在下感

python学习笔记-对象持久化保存与恢复

序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人.你会怎么做?嗯, 这取决于你想要怎么保存,怎么重用,发送给谁.很多游戏允许你在退出的时候保存进度,然后你再次启动的时候回到上次退出的地方.(实际上, 很多非游戏程序也会这么干.) 在这个情况下, 一个捕获了当前进度的数据结构需要在你退出的时候保存到磁盘上,接着在你重新启动的时候从磁盘上加载进来.这个数据只会被创建它的程序使用,不会发送到网络上,也不会被其它程序读取.因此,互操作的问题被限制在保证新版本的程序能