2.3变量

var 类型推断

type 类的分类 如:type nametype = name.GetType(); //取变量name的类型

const 常量  const int painame = 3.1415

char 是字符类型 string是字符串类型

2.5语句

选择语句:switch(变量){case 常量值1:语句1 break;…………;default 常量值n:语句2 break;}

二个值相同语句时:switch(变量){case 常量值1:case 常量值1:语句1 break;…………;default 常量值n:语句2 break;}

wile 循环一般用在不知道循环多少次的情况下

do…wile 是先循环后判断

foreach() 遍历

goto 跳转语句 goto pray;语句1;…………;pray: 语句n; ///直接跳过语句1执行语句n (大多情况下不允许用慎用)

break 跳出循环体

continue 跳过当次循环(非跳出循环体)

2.6枚举型

Main()
{
TimeOfDay time = (TimeOfDay)Enum.Parse(typeof(TimeOfDay), "afternoon",true); //从字符串对应的值,参数3区分大小写
Console.WriteLine((int)time);
TimeOfDay time2 = TimeOfDay.Evening;
Console.WriteLine((int)time2);//输出为2
        }
public enum TimeOfDay
{
morning = ,
Afternoon = ,
Evening = ,
}

2.7空间名称

testpray.testclass.Class1.***()
namespace testpray
{
namespace testclass {
class Class1
{}}}

2.8给Main()方法传递参数

static int Main(string[] args)
{
for (int i = ; i < args.Length; i++)
{
Console.WriteLine(args[i]);
}
return ;
}
//在CMD下运行程序 test /a /r /e ,a、r、e为参数

2.10控制台

Console.WriteLine("{0,4:C2}\n",i,} // 0表示索引值(对应变量I),4表示宽度(正直表示右对齐,负值表示左对齐,C2表输出精度后2位的货币,)

C 货币
D 十进制
E 科学计数法
F 小数点位数
G 普通格式 (只显示前n个有效数字)
N 显示千分制     12543.234      n2        12,543.12
p 百分数      0.52123           p2                 52.12%
X 十六进制    

2.12 C#预处理指令

#define  名称符号  (声明存在这个符号,用于调试)         #undef 名称符号 (删除符号)

#if  名称符号 (在前面的#define时才会执行)    #

3.3 类

类的参数,如果是引用类型(如数组或类)传递给方法,对应的方法会改变数组中的值,而新值会反射在原数组里.

ref 参数,在值参数前加入ref 其方法对参数的改变会在原始对象中体现!(调用时也要在参数上添加 ref)

out 参数,传递时变量可以不初始化,(调用时也要在参数前加 out)

命名参数,调用时可 test(i:32,98);

可选参数,必须在是方法定义的最后的参数(net4) 例:void test(int i,int n = 10) {…} //多个可选参数时可与命名参数指定参数!

方法的重载

属性的访问修饰符如: public name{get{} private set{}}

(构造函数???)

struct 定义一个结构体 如struct 名称 {}    注:结构是值类型

partial 部分类 ,在多个文件中存放有方法和属性  例: partial class name{}

3.10 扩展方法

扩展方法是静态方法  新建一个静态类,然后其内容中添加:

public static void AddToAmount(this 类名 参数1,扩展的方法) {参数1.Amount += 扩展的方法 }

4.3.1虚方法 (用于多态性)

virtual 关键字,例 基类: public virtual string Testprint(){} 派生类:public override string Testprint()注:字段与静态函数不能声明为virtual

using System;
namespace PolymorphismApplication
{
class Shape
{
protected int width, height;
public Shape( int a=, int b=)
{
width = a;
height = b;
}
public virtual int area()
{
Console.WriteLine("父类的面积:");
return ;
}
}
class Rectangle: Shape
{
public Rectangle( int a=, int b=): base(a, b)
{ }
public override int area ()
{
Console.WriteLine("Rectangle 类的面积:");
return (width * height);
}
}
class Triangle: Shape
{
public Triangle(int a = , int b = ): base(a, b)
{ }
public override int area()
{
Console.WriteLine("Triangle 类的面积:");
return (width * height / );
}
}
class Caller
{
public void CallArea(Shape sh)
{
int a;
a = sh.area();
Console.WriteLine("面积: {0}", a);
}
}
class Tester
{ static void Main(string[] args)
{
Caller c = new Caller();
Rectangle r = new Rectangle(, );
Triangle t = new Triangle(, );
c.CallArea(r);
c.CallArea(t);
Console.ReadKey();
}
}
}

实例:虚方法的多态性

4.3.2隐藏方法要隐藏基类时要用New

调用基类的方法 base.基类函数名()

抽象类与方法   必须在派生类中重写,   理解用于防漏写方法 修饰符:abstract

密封类与方法  例 sealed class name{} 对于类表示不能继承,  对于方法表示不能重写

注:应用于方法或属性时,sealed 修饰符必须始终与 override 结合使用。

4.36 带参数的构造函数  this()表示当前法

4.5 接口 关键字:interface   例  public interface IDisposable{} 有点类类似抽象类 接口的应用统一接口 相关介绍

派生的接口例:(如不理解请查看108页与相关介绍)

public interface ITransferBankAccount : IBankAccount
{
bool TransferTo(IBankAccount destination, decimal amount);
}

5.1.1泛型 相关介绍与用法可参考

5.3.2约束 where T :struct 对于结构约束,类型T必须是值类型

5.4.1 协变与抗变 相关资料 相关理解

        static void Main(string[] args)
{
//协变
IIndex<Rectangle> rectangles = RectangleCollection.GetRectangles();
IIndex<Shape> shapes = rectangles;
for (var i = ; i < shapes.Count; i++)
{
Console.WriteLine(shapes[i]);
}
Console.ReadKey();
}
}
public class Shape
{
public double Width { get; set; }
public double Height { get; set; } public override string ToString()
{
return string.Format("Width: {0}, Height: {1}.", Width.ToString(), Height.ToString());
}
}
public class Rectangle : Shape
{ } public interface IIndex<out T>
{
T this[int index] { get; }
int Count { get; }
}
public class RectangleCollection : IIndex<Rectangle>
{
private readonly Rectangle[] _data = new Rectangle[]
{
new Rectangle{Height = ,Width = },
new Rectangle{Height = ,Width = },
new Rectangle{Height = ,Width = },
}; public static RectangleCollection GetRectangles()
{
return new RectangleCollection();
} public Rectangle this[int index]
{
get
{
if (index < || index > _data.Length)
throw new ArgumentOutOfRangeException("index");
return _data[index];
}
} public int Count { get { return _data.Length; } }

协变实例

6.4锯齿数组

int[][] =new int[3],[]

6.5Array类 如果数组元素超出整数取值范围,可以做用longlength属性来获取元素大小,,,Rank属性-数组的维数

6.5.1创建数组 Array1.CreateInstance(typeof(int),5)

设置数组元素Array1.SetValue(元素值,下标); 获取元素Array1.GetValue(下标);

6.5.2复制数组 因数组为引用类型,所以不能直接用等号,如果数组的元素为值类型,复制用 Array2=(int[]) Array1.Clone(); 注意如果数组的元素为引用类型则只复制引用,修改其只一个会改变另一个对象,如要深层副本,则必须迭代数组并创建新对象。

6.5.3数组排序 简单类型int与String可直接Array.Sort(数组)排序,如自定义类, 要使之实现IComparable<类>接口的Compareto方法,如下:

public int CompareTo(Person other)
{
if (other == null) throw new ArgumentNullException("other"); int result = this.LastName.CompareTo(other.LastName);
if (result == )
{
result = this.FirstName.CompareTo(other.FirstName);
} return result;
}

6.6.2 ArraySegment<T>

static void Main()
{
int[] ar1 = { , , , , , };
int[] ar2 = { , , , , , , };
//分隔ar1的索引0后的3个元素,与ar2的索引3后的3个元素.
var segments = new ArraySegment<int>[] {new ArraySegment<int>(ar1, , ), new ArraySegment<int>(ar2, , )};
var sum = SumOfSegments(segments);
Console.WriteLine("sum of all segments: {0}", sum);
Console.ReadKey();
} static int SumOfSegments(ArraySegment<int>[] segments)
{
int sum = ;
foreach (var segment in segments)
{
for (int i = segment.Offset; i < segment.Offset + segment.Count; i++)
//i取的是数组的原数组下标值!即ar1与ar2的下标
{
sum += segment.Array[i];
}
}
return sum;
}

如数组段中改变了数组,则原数组也会改变!

6.7.3yield语句(yield是一个语法糖)

1迭代集合不同方式

class Program
{
static void Main()
{
var titles = new MusicTitles();
foreach (var title in titles.Subset(, ))
{
Console.WriteLine(title);
}
}
}
public class MusicTitles
{
string[] names = { "Tubular Bells", "Hergest Ridge", "Ommadawn", "Platinum" };
public IEnumerable<string> Subset(int index, int length)
{
for (int i = index; i < index + length;
i++)
{
yield return names[i];
}
}
}

2用yieid return 返回枚举器

static void Main()
{
var game = new GameMoves();
IEnumerator enumerator = game.Cross();
while (enumerator.MoveNext())
{
enumerator = enumerator.Current as IEnumerator;
}
Console.ReadLine();
} public class GameMoves
{
private IEnumerator cross;
private IEnumerator circle;
public GameMoves()
{
cross = Cross();
circle = Circle();
}
private int move = ;
const int MaxMoves = ;
public IEnumerator Cross()
{
while (true)
{
Console.WriteLine("Cross, move {0}", move);
if (++move >= MaxMoves)
yield break;
yield return circle;//下一次为circle方法
}
}
public IEnumerator Circle()
{
while (true)
{
Console.WriteLine("Circle, move {0}", move);
if (++move >= MaxMoves)
yield break;
yield return cross;//下一次为Cross方法
}
}
}

6.8元组

var result = Divide(, );
Console.WriteLine("result of division: {0}, reminder: {1}, resum:{2}", result.Item1, result.Item2, result.Item3);
public static Tuple<int, int,int> Divide(int dividend, int divisor)
{
int result = dividend / divisor;
int reminder = dividend % divisor;
int resum = dividend + divisor;
return Tuple.Create<int,int,int>(result, reminder, resum);

6.9结构比较

通过类IStructuralEquatable接口实现比较内容与引用!

对于IstructuralEquatable接口定义的Equals()方法,它的第一个参数是object类型,
       第二个参数是IEqualityComparer类型。调用这个方法时,通过传递一个实现了IEqualityComparer<T>的对象,就
      可以定义如何进行比较。通过EqualityComparer<T>类完成IEqualityComparer的一个默认实现。这个实现检查类型是否
      实现了IEquatable接口,并调用IEquatable.Equals()方法(即这里的Person类的Equals方法)。如果该类型没有实现IEquatable,就
      调用Object基类中的Equals()方法进行比较。
                  if ((persons1 as IStructuralEquatable).Equals(
                persons2, EqualityComparer<Person>.Default))
       单步调试上面这行代码时,由于persons1和persons2共有三个元素
       所以比较函数会进行三次(注意:会被执行三次),由于两个数组中第三个元素的FirstName
       不相同,所以返回内容不相同的结果
注意:如果两个数组的元素个数不相等,则直接返回不相等,不会调用Person类的Equals比较方法

static void Main()
{
var janet = new Person { FirstName = "Janet", LastName = "Jackson"};
Person[] persons1 = { new Person { FirstName = "Michael", LastName = "Jackson" }, janet };
Person[] persons2 = { new Person { FirstName = "Michae2", LastName = "Jackson" }, janet };
Console.WriteLine(janet.ToString());
Console.ReadLine();
if (persons1 != persons2) {
Console.WriteLine("不相同的引用");
}
if (!persons1.Equals(persons2))
Console.WriteLine("等于返回false -不相同的引用");
if ((persons1 as IStructuralEquatable).Equals(persons2, EqualityComparer<Person>.Default))
Console.WriteLine("相同的内容");
} public class Person : IEquatable<Person>
{
public int Id { get; private set; }
public string FirstName { get; set; }
public string LastName { get; set; } public override string ToString()
{
return String.Format("{0}, {1} {2}", Id, FirstName, LastName);
}
public bool Equals(Person other)
{
if (other == null)
return base.Equals(other); return this.FirstName == other.FirstName && this.LastName == other.LastName;
}
}

C#高级编程笔记 (1至6章节)数组,类/方法/泛型的更多相关文章

  1. C#高级编程笔记 (6至10章节)运算符/委托/字符/正则/集合

    数学的复习,4^-2即是1/4/4的意思, 4^2是1*2*2的意思,而10^-2为0.01! 7.2运算符 符号 说明 例   ++ 操作数加1 int i=3; j=i++; 运算后i的值为4,j ...

  2. C#高级编程笔记(22至25章节)文件\注册表\权限\事务

    22安全(using System.Security.Principal;) AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.Wi ...

  3. C#高级编程笔记(17至21章节)线程/任务

    17 Visual Studio 2013 控制台用Ctrl+F5可以显示窗口,不用加Console.ReadLine(); F5用于断点调式 程式应该使用发布,因为发布的程序在发布时会进行优化, 2 ...

  4. Android高级编程笔记(四)深入探讨Activity(转)

    在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ...

  5. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...

  6. javascript高级编程笔记01(基本概念)

    1.在html中使用JavaScript 1.  <script> 元素 <script>定义了下列6个属性: async:可选,异步下载外部脚本文件. charset:可选, ...

  7. C#高级编程笔记之第三章:对象和类型

    类和结构的区别 类成员 匿名类型 结构 弱引用 部分类 Object类,其他类都从该类派生而来 扩展方法 3.2 类和结构 类与结构的区别是它们在内存中的存储方式.访问方式(类似存储在堆上的引用类型, ...

  8. C#高级编程笔记之第二章:核心C#

    变量的初始化和作用域 C#的预定义数据类型 流控制 枚举 名称空间 预处理命令 C#编程的推荐规则和约定 变量的初始化和作用域 初始化 C#有两个方法可以一确保变量在使用前进行了初始化: 变量是字段, ...

  9. C#高级编程笔记(11至16章)异步/托管/反射/异常

    11.1.2LINQ语句 LINQ查询表达式以from子句开始,以select或者group子句结束.在这两个子句之间可以跟零个或者多个from.let.where.join或者orderby子句. ...

随机推荐

  1. 解决kubernetes拉取不了镜像仓库的问题

    将镜像仓库地址k8s.gcr.io改成registry.aliyuncs.com/google_containers

  2. [Ynoi2012]D1T3

    https://www.luogu.org/problemnew/show/P5311 题解 先把点分树建出来. 对于吗,每一个询问\((l,r,x)\),我们对于x要找到它在点分树上最靠上的父亲节点 ...

  3. ThreadPoolExecutor实现异步多线程

    import time from concurrent.futures import ThreadPoolExecutor executor = ThreadPoolExecutor(max_work ...

  4. Vim 8.0 版本安装方法及添加Python支持

    利用Git安装 最简单也是最有效的方法 1. 获取Vim仓库: git clone https://github.com/vim/vim.git 2. 升级到最新的版本: cd vim git pul ...

  5. JSP_01

    1.定义局部变量.输出语句 <!doctype html> <html> <head> <title>定义局部变量.输出语句</title> ...

  6. Unity3D架构之PureMVC

    之前了解过UI实现框架大多是用MVC架构的,才听说有这么一个基于MVC的跨平台开源框架叫PureMVC,前几天用到了做了一下,写一写分析总结官网位置:http://puremvc.org/ PureM ...

  7. Bootstrap 学习笔记12 轮播插件

    轮播插件: <!-- data-ride="carousel"自动播放 --> <div id="myCarousel" class=&quo ...

  8. Python分布式爬虫必学框架Scrapy打造搜索引擎 学习教程

    Python分布式爬虫打造搜索引擎Scrapy精讲—用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 1.创建搜索自动补全字段suggest自动补全需要用 ...

  9. POJ-1611.TheSuspects.(并查集)

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 55832   Accepted: 26501 De ...

  10. css禁止事件

    js有多种禁止事件的方法, css也有: pointer-events:none