class PhoneClass 
{
public const string DayOfSendingBill = "Monday";
public int CustomerID;
public string FirstName;
public string LastName;
}

结构

struct PhoneStruct
{
public const string DayOfSendingBill = "Monday";
public int CustomerID;
public string FirstName;
public string LastName;
}

类是存储在堆(heap)上的引用类型,而结构是存储在栈(stack)上的值。较小的数据类型是使用结构,可提供性能。

类和结构,都需要使用 new 来声明实例。

PhoneClass phone = new PhoneClass()
PhoneStruct phone = new PhoneStruct()

类函数成员

  • 方法是与某个类相关的函数,与数据成员一样,函数成员默认为实例成员,实用static修饰符可以把方法定义为静态方法。
  • 属性是可以从客户端访问的函数组,其访问方式与访问类的公共字段类似。
  • 构造函数是实例化对象时自动调用的特殊函数。它必须与类同名,且不能有返回类型。
  • 终结器(析构函数) 名称与类名相同 前面有个 "~" 符号。
  • C#允许已有的运算符应用于自己的类,进行运算符重载。
  • 索引器允许对象以数组或集合的方式进行索引。

函数传递参数

对于复杂的数据类型,按引用传递效率更高,因为按值传递时,必须复制大量数据。

ref 参数

迫使值参数通过引用传送给方法,方法对变量所做的改变,都会影响原始对象值。

static void Main(string[] args)
{
int i = ;
Console.WriteLine("{0}",i);
Modify(ref i);
Console.WriteLine("{0}", i);
Console.ReadLine();
} static void Modify(ref int i)
{
i = ;
}

C# 要求传递方法的参数必须进行初始化。

out参数

out关键字初始化,传递给该方法的变量可以不初始化,方法返回时,方法内对变量所做的改变,都会保留下来。

static void Main(string[] args)
{
int i;
Modify(out i);
Console.WriteLine("{0}", i);
Console.ReadLine();
} static void Modify(out int i)
{
i = ;
}

命名参数

允许是通过参数名,按任意顺序传递。

static void Main(string[] args)
{
Console.WriteLine("{0}", FullName("John", "Doe"));
Console.WriteLine("{0}", FullName(lastName: "Doe", firstName: "John"));
Console.ReadLine();
} static string FullName(string firstName, string lastName)
{
return firstName + " " + lastName;
}

可选参数

可选参数必须提供默认值,且必须是在定义在方法的最后的参数。

static void Main(string[] args)
{
Console.WriteLine("{0}", FullName(firstName: "John"));
Console.ReadLine();
} static string FullName(string firstName, string lastName="Default")
{
return firstName + " " + lastName;
}

方法重载

方法名相同,参数的个数 或 类型不同。

class TestFun
{
void DoFun(string result)
{ } void DoFun(int result)
{ }
}

方法重载不能使用可选参数,可通过函数重载来实现此目的。

 public void DoFun(string result)
{
this.DoFun(result, );
} public void DoFun(string result,int index)
{
Console.WriteLine("DoFun2");
}
  • 两个方法不能仅在返回类型上有区别。
  • 两个方法不能仅根据参数是声明为ref还是out来区分。

属性

private string _someProperty;
public string SomeProperty
{
get { return _someProperty; }
set { _someProperty = value; }
}

自动实现属性

 public string SomeProperty { get; set; }

属性访问修饰符

C#允许给属性的 get 和 set 访问器设置不同的访问修饰符。在 get 和 set 访问器中,必须有一个具备属性的访问级别。

public string SomeProperty { get; private set; }

通过属性访问字段,需要担心带来性能损失。C#代码会编译为IL,然后在运行时JIT编译为本地可执行代码。JIT编译器可以生成高度优化的代码,并在适当的时候随意地内联代码。任何内联代码完全有ClR决定,不能像C++中像 inline 这样关键字控制方法是否内联。

构造函数

构造函数声明一个与类同名的方法,且没有返回类型。

class TestFun
{
private int _number;
public TestFun(int number)
{
this._number = number;
}
} TestFun testFun = new TestFun();

私有化构造函数

class TestFun
{
private int _number;
private TestFun(int number)
{
this._number = number;
}
}
  • 类仅用某些静态成员或属性的容器,因此永远不会实例化它。
  • 类仅通过调用某个静态成员函数来实例化

静态构造函数

static TestFun()
{ }

静态构造函数,是在加载类时,有 .net 运行库调用它,静态构造函数不能带参数,一个类也只能有一个静态构造函数。静态构造函数只能访问静态成员,不能访问类的实例成员。

无参数的实例构造参数与静态构造参数可以同一类中同时定义。

class TestFun
{
public static readonly string BackColor; static TestFun()
{
DateTime now = DateTime.Now;
switch (now.DayOfWeek)
{
case DayOfWeek.Monday:
BackColor = "Green";
break;
default:
BackColor = "Red";
break;
}
}
} class Program
{
static void Main(string[] args)
{
Console.WriteLine("{0}",TestFun.BackColor);
Console.ReadLine();
}
}

从构造函数中调用其他构造函数

class Car
{
public string description;
public uint numWheels; public Car(string description, uint numWheels)
{
this.description = description;
this.numWheels = numWheels;
} public Car(string description): this(description, )
{ } //public Car(string description)
//{
// this.description = description;
// this.numWheels = 4;
//}
} class Program
{
static void Main(string[] args)
{
Car car = new Car("Audio");
Console.WriteLine("{0} {1}",car.description,car.numWheels);
Console.ReadLine();
}
}

这是C# 特殊语法,称为构造函数初始化器。注意 初始化器不能有多个调用。

 public Car(string description): this(description, )

只读字段

只读字段只能在构造函数中给只读字段赋值,只读字段可以是一个实例字段。如果要把只读字段设置为静态,必须显示声明它。

public static readonly uint StaticCars;
static Car()
{
StaticCars = ;
} public readonly uint SampleCars; public Car()
{
SampleCars = ;
}

静态只读,只能在静态构造函数赋值。实例只读,在实例构造函数赋值。当然也可以在声明时赋值。

匿名类型

var 和 new 一起使用创建匿名类型。

var caption = new {FirstName = "James", LastName = "Leonard"};

结构

结构是值类型,定义结构和类完全相同。

struct Car
{
public int nWheel;
public string description; public Car(string description,int nWheel)
{
this.description = description;
this.nWheel = nWheel;
}
}
  • 结构不支持继承。
  • 对于结构,构造函数是不允许替换的。
  • 使用结构,可以指定字段如何在内存中布局。
Car car = new Car("Audio",);
Console.WriteLine("{0} {1}",car.description,car.numWheels); Car car2 = new Car();
car2.description = "BMW";
car2.numWheels = ;
Console.WriteLine("{0} {1}", car2.description, car2.numWheels);

结构分配内存时,速度非常快,因为它们将内联或者保存在栈中。在结构超出了作用作用域,删除也是很快。负面影响,当把结构作为参数传递时,结构的所有内容就被复制,对于类就不会。应使用 ref 参数传递,以避免性能损失。

结构的构造函数

构造函数的方式与类定义构造函数方式相同,但不允许定义无参数的构造函数。

结构不能在绕过构造函数进行赋值,否则会出现编译错误。

也可以像类一样 提供 Close 或 Dispose 方法。

弱引用

只要有代码引用它,就会形成强引用。弱引用创建和使用对象,它在垃圾回收器回收时,就会回收对象并释放内存。

弱引用由 WeakReference 创建

MathTest math = new MathTest();
WeakReference mathReference = new WeakReference(math);
if (mathReference.IsAlive)
{
math = mathReference.Target as MathTest;
math.x = ;
math.y = ;
Console.WriteLine("{0}", math.Value);
}

部分类

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

用法放在 class、struct、interface前面。

// MathTest1.cs
partial class MathTest1
{
public void MethodOne()
{ }
} // MathTest2.cs
partial class MathTest1
{
public void MethodTwo()
{ }
}

这样这个类 MathTest1 就拥有了 两个方法。

静态类

在 class 前面加上 static,就声明了静态类。静态类里不能拥有实例成员和函数。

 static class Math
{
public static int Add(int x, int y)
{
return x + y;
}
} class Program
{
static void Main(string[] args)
{
Math.Add(, );
Console.ReadLine();
}
}

Object类

如果定义类时没有指定基类,编译器就会自动假定这个类派生自 Object。

结构总是派生自 System.ValueType。 System.ValueType 又派生自 System.Object

System.Object 方法

  • ToString()                         获取对象表示的字符串。如果需要复杂的字符串表示,需要实现 IFormattable 接口。
  • GetHashCode()                  如果对象放在名为映射的数据结构中,就是使用这个方法。使用该方法确定放在什么地方。
  • Equals 和 ReferenceEquals   比较对象相等性
  • Finalize                              类似析构函数,在垃圾回收时,重写Finalize函数,系统会自动调用它,执行。Object 实现的函数,实际什么也没有做。
  • GetType            返回总 System.Type  派生类的一个实例。
  • MemberwiseClone               等到一个浅复制的对象。该方法不是须方法,所以不能重写它。

ToString实例

class Money
{
public decimal amount; public override string ToString()
{
return "$" + amount.ToString();
}
} class Program
{
static void Main(string[] args)
{
Money money = new Money();
money.amount = ;
Console.WriteLine("{0}",money); decimal amount = ;
Console.WriteLine("{0}", amount); Console.ReadLine();
}
}

扩展方法

假设想在Money中添加一个方法 AddToAmount。但是由于某种原因不能在源文件中修改。此时可以扩展方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplicationCShape
{
public class Money
{
public decimal amount; public override string ToString()
{
return "$" + amount.ToString();
}
} class Program
{
static void Main(string[] args)
{
Money money = new Money();
money.amount = ;
money.AddToAmount();
Console.WriteLine("{0}",money); Console.ReadLine();
}
}
} namespace ConsoleApplicationCShape
{
public static class MoneyExtension
{
public static void AddToAmount(this Money money, decimal amountToAdd)
{
money.amount += amountToAdd;
}
}
}

如果扩展方法与类方法同名,就不会调用扩展方法。

C# 对象和类型(2) 持续更新的更多相关文章

  1. Tensorflow中Tensor对象的常用方法(持续更新)

    Tensor是Tensorflow中重要的对象.下面是Tensor的常用方法,后面还会写一篇随笔记录Variable的用法. 1. 生成一个(常)Tensor对象 >>>A = tf ...

  2. FireFox所支持的全部标签(持续更新ing)

    近期研究上各个浏览器的差别,得到一些资料,FireFox眼下所支持的全部标签类型,持续更新,供大家參考和学习,不喜勿喷哦 http://mxr.mozilla.org/seamonkey/source ...

  3. katalon Studio之WebUi自动化测试视频教程持续更新

    通知...通知...通知... 为了更好的把katalon Studio自动化测试工具推广给大家,最近在B站中开通了视频专栏,地址如下: https://www.bilibili.com/video/ ...

  4. 100万套PPT模板,包含全宇宙所有主题类型PPT,绕宇宙100圈,持续更新

    100万套PPT模板,包含全宇宙所有主题类型PPT(全部免费,都是精品,没有一张垃圾不好看的PPT,任何一张PPT拿来套入自己的信息就可以立马使用),绕宇宙100圈,任意一个模板在某文库上都价不菲.强 ...

  5. ( 译、持续更新 ) JavaScript 上分小技巧(四)

    后续如有内容,本篇将会照常更新并排满15个知识点,以下是其他几篇译文的地址: 第一篇地址:( 译.持续更新 ) JavaScript 上分小技巧(一) 第二篇地址:( 译.持续更新 ) JavaScr ...

  6. ( 译、持续更新 ) JavaScript 上分小技巧(三)

    最近家里杂事较多,自学时间实在少的可怜,所以都在空闲时间看看老外写的内容,学习之外顺便翻译分享~等学习的时间充足些再写写自己的一些学习内容和知识点分析(最近有在接触的:复习(C#,SQL).(学习)T ...

  7. ( 译、持续更新 ) JavaScript 上分小技巧(二)

    考虑到文章过长,不便于阅读,这里分出第二篇,如有后续,每15个知识点分为一篇... 第一篇地址:( 译.持续更新 ) JavaScript 上分小技巧(一) 第三篇地址:( 译.持续更新 ) Java ...

  8. ( 译、持续更新 ) JavaScript 上分小技巧(一)

    感谢好友破狼提供的这篇好文章,也感谢写这些知识点的作者们和将他们整理到一起的作者.这是github上的一篇文章,在这里本兽也就只做翻译,由于本兽英语水平和编程能力都不咋地,如有不好的地方也请多理解体谅 ...

  9. 关于ASP.NET MVC开发设计中出现的问题与解决方案汇总 【持续更新】

    最近一直用ASP.NET MVC 4.0 +LINQ TO SQL来开发设计公司内部多个业务系统网站,在这其中发现了一些问题,也花了不少时间来查找相关资料或请教高人,最终都还算解决了,现在我将这些问题 ...

  10. UIButton 文档翻译(持续更新)

    UIButton 文档翻译 继承 UIControl; UIView; UIResponder; NSObject 协议 UIFocusEnvironment,UIAppearanceContaine ...

随机推荐

  1. java 访问数据库公共类

    package com.javaweb.mvc; import java.sql.*; /** * @author 公共数据访问类 * * Statement 和 PreparedStatement之 ...

  2. Guava源码阅读-collect-Multiset

    package com.google.common.collect; 我们在进行字符统计时,同常采用的方法就是: String[] text=new String[]{"the weathe ...

  3. JavaScript里的类和继承(转)

    转自: http://www.h5cn.com/js/jishu/2016/0121/17634.html js与大部分客户端语言有几点明显的不同: JS是 动态解释性语言,没有编译过程,它在程序运行 ...

  4. webpack4实例

    webpack现在已经成为前端很多的打包器.网上关于webpack的相关文章也是很多,本文主要是根据自己的学习步骤来记录的,进行简单的webpack实例的讲解. 注意:一定要确定安装的node.js的 ...

  5. 洛谷 题解 P1352 【没有上司的舞会】

    树形DP的一道较为基础的模板题 状态 dp[i][0/1]为第i个员工是否来参加的最大值 转移 先找到根节点 先遍历完它的儿子,再来更新答案 dp[i][0]+=max(dp[j][0],dp[j][ ...

  6. 【转】mysql分库分表,数据库分库分表思路

    原文:https://www.cnblogs.com/butterfly100/p/9034281.html 同类参考:[转]数据库的分库分表基本思想 数据库分库分表思路   一. 数据切分 关系型数 ...

  7. 删除重复信息且要保留一条的(roacle的rowid另类用法)

    由于表的主键失效了(disable),导致导入了一些主键重复的数据,想保留唯一的一条, 最后发现其实可以用rowid来实现,不知道算不算是rowid的另类用法. delete /*+ parallel ...

  8. MyBatis配置文件中的标签mappers的子标签mapper的url属性

    在浏览器中输入file:/可以打开访达根目录,file:后面至少跟一个杠 MyBatis配置文件中的标签mappers的子标签mapper的url属性中file:后面至少要跟两个杠

  9. 1.4Zookeeper和Thymeleaf的使用

    什么是Zookeeper? Zookeeper 是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务.配置维护和命名服务等等.采用下图描述zookeep ...

  10. S03_CH01_AXI_DMA_LOOP 环路测试

    S03_CH01_AXI_DMA_LOOP 环路测试 1.1概述 本课程是本季课程里面最简单,也是后面DMA课程的基础,读者务必认真先阅读和学习. 本课程的设计原理分析. 本课程是设计一个最基本的DM ...