虽然用了这么久的C#,用会用,但有些东西为什么这么用就不了解了。所以,决定持续巩固梳理基础~~~
1.栈:栈是一个内存数组.
2.堆:堆是一块内存区域.
3.值类型:存储在栈中.
4.引用类型:存数在堆中.
5.类:类是一个可以存储数据并执行代码的数据结构.
6.方法:
/*****************
方法是具有名称的可执行代码块.可以使用方法名称从别的地方执行代码,也可把数据传入方法并接受数据输出.
方法有两个主要部分,方法头和方法体.
方法头指定方法的特征,方法是否返回数据,如果返回,返回什么类型.
方法体包含可执行代码的语句.
*****************/
7.访问修饰符:
/*****************
public:公有,同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员.
private:私有,只有同一类或结构中的代码可以访问该类型或成员.
internal:内部,同一程序集中的任何代码都可以访问该类型或成员,但其他程序集中的代码不可以.
protected:受保护,只有同一类或结构或者此类的派生类中的代码才可以访问的类型或成员.
protected internal:受保护内部的,由其声明的程序集或另一个程序集派生的类中任何代码都可访问的类型或成员。 从另一个程序集进行访问必须在类声明中发生,该类声明派生自其中声明受保护的内部元素的类,并且必须通过派生的类类型的实例发生.
*****************/
8.命名参数:
/*****************
位置不必再一一对应相应形参位置,用:方式可在任意位置定义
如:
int i = m.call(c:1,b:2,a:1);
public int call(a,b,c)
{return a+b+c;}
*****************/
9.静态属性:存在,不管类是否有实例,当从类的外部访问时,必须使用类名引用,而不是实例名。
10.实例构造函数:
/*****************
实例构造函数是一个特殊的方法,它在类的每个新实例创建的时候执行。
构造函数用于初始化类实例的状态(在new一个类的对象时首先执行)。
*****************/
11.带参数的构造函数:
/*****************
构造函数可以带参数,可以被重载。
class C
{ int Id;String Name;
public C(){Id=7777; Name="XXX";}
public C(int val){Id=val; Name="XXX";}
public C(String name){Name=name}
public void write()
{Console.WriteLine("ID:{0}, Name:{1}",Name,Id);}}
class p
{ static void Main() { C x = new C(), y = new C(5257), z = new C("qiqi"); x.write(); y.write(); z.write(); } }输出结果:
ID:7777, Name:XXX
ID:5257, Name:XXX
ID:0, Name: qiqi
*****************/
*Random函数:
/*****************
Random.Next() 返回非负随机数;
Random.Next(Int) 返回一个小于所指定最大值的非负随机数
Random.Next(Int,Int) 返回一个指定范围内的随机数
*****************/
12.this关键字:
/*****************
this关键字在类中使用,是对当前实例的引用.
用于区分类的成员和本地变量或参数.
用于调用方法的实参.
*****************/
12.隐藏基类的成员:
/*****************
虽然派生类不能删除它继承的任何成员,但它可以隐藏它们。
要隐藏一个集成的数据成员,需要声明一个新的相同类型的成员,并使用相同的名称。
要让编译器知道你在故意隐藏继承成员,使用New修饰符。
可以隐藏静态成员。
*****************/
*泛型例子:
/*****************
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{ class MyStack{ T[] StackArray; int StackPointer; public void Push(T x) { if(!IsStackFull) { StackArray[StackPointer++] = x; } } public T Pop() { return (!IsStackEmpty) ? StackArray[--StackPointer] : StackArray[0]; } const int MaxStack = 10; bool IsStackFull { get { return StackPointer >= MaxStack; } } bool IsStackEmpty { get { return StackPointer <= 0; } } public MyStack() { StackArray = new T[MaxStack]; } public void print() { int i = StackPointer-1; while (i >= 0) { Console.WriteLine("Value:{0}",StackArray[i]); i--; } Console.ReadLine(); } } class Program { static void Main(string[] args) { var stackInt = new MyStack (); var stackString = new MyStack (); stackInt.Push(3); stackInt.Push(5); stackInt.Push(7); stackInt.print(); stackString.Push("fanxing are great"); stackString.Push("hi there"); stackString.print(); } }}
*****************/
*扩展方法例子:
/*****************
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 public static class helper 2 3 { 4 5 public static string MD5Hash(this string s) 6 7 { 8 9 return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s,"MD5");10 11 }12 13 14 15 public static bool In(this object o, IEnumerable b)16 17 {18 19 foreach(object obj in b)20 21 {22 23 if(obj==o)24 25 return true;26 27 }28 29 return false;30 31 } 32 33 }34 35 36 37 // 调用扩展方法38 39 Console.WriteLine("123456".MD5Hash());40 41 Console.WriteLine("1".In(new[]{ "1","2","3"}));
很多时候我们需要对CLR类型进行一些操作,苦于无法扩展CLR类型的方法,只能创建一些helper方法,或者生成子类。扩展方法使得这些需求得意实现,同时也是实现LINQ的基础。定义扩展方法需要注意,只能在静态类中定义并且是静态方法,如果扩展方法名和原有方法名发生冲突,那么扩展方法将失效。摘自【】
*****************/