C# basic study

.Net Framework架构如下

VB, VC, C#, Java, JScript...
公共语言规范(common Language Specification)
ASP.net | widons Forms
ADO.Net and XML
基类库(Base Class Library)
公共语言运行时(CLR)
windows COM+ Services

简单地例子---新建空白解决方案,新建C# 控制台

using System;               //引用名字空间
//using System.Text;
//using a = System.Threading; //这样可以在下面使用a.什么的类库函数

namespace ConsoleApplication1 // 同一个name下面类名字不可以相同
{
 /// <summary>
 /// Class1 的摘要说明。  // C# 中的 特有的注释'///'
 /// </summary>           "///" 的注释,里面很多的tag ,这样可以自动生成说明文档
 /// <paramref name="args">test Name</paramref>
 class Class1
 {
  /// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main(string[] args) // 注意这儿的Main 是大写的M, 返回值必须是void的或者int 类型
  {
   //
   // TODO: 在此处添加代码以启动应用程序
   //
   Console.WriteLine("Hello, Welcome");
   Console.ReadLine();
  }
 }
}
output : Hello, Welcom

看他的生成代码过程
首先把cs文件生成了IL中间语言,所以,vb和c# 的都可以互相调用

在实际运行过程中, CLR有一个编译器叫做JIT,会实时的把IL语言编译成二进制代码,所以运行的时候是边编译边运行,所以第一次可能有点慢

最后在文件夹中的bin/Debug文件夹中找到生成的.exe文件
第一个程序结束
---------------

数据类型:

值类型,运行速度快,效率高
引用类型,都放到堆中,由CLR控制

值类型
整数类型:  
  sbyte 有符号的8位整数 -128 ~ 127
  byte 无符号 8  0~25
  short 有符号16位
  ushort 无符号16位
  int 有符号32位
  unit 无符号32位
  long 有符号64位
  ulong 无符号64位
  

布尔类型,和java相同

实数类型:float 精度7位, double 精度为15 到 18位, decimal精度为128位

写的时候 float a = 1.4f;
 double a = 1.5;
 decimal a = 1.5m;

字符类型
 长度为16位, char c = 'a';
 char c='/x0032';
 /n /r /t /v /a /b

 长度为16位

结构类型: 属于值类型,和class不同
Stuct PhoneBook{
 public string name;
 public uint age;
 public struct address"
  public string city;
  public unit no;
 }
}
//用法和Class相同,好处是取得时候很容易,并且可以进行结构的嵌套
//如果简单的话,用它比较快,复杂的话用Class类

枚举类型:
定义的时候是,
enum Week:long // 定义类型,缺省为int
{
 Sunday;
 Monday; // 缺省值为0
 Tuesday = 4;
}
结构是由不同类型的数据组成的一组新的数据类型
枚举类型的变量在某一是看只能够取其中的一个元素的值,例如Week.Sunday;

引用类型:...


object 类;// C# 和java一样,都是单继承,可以继承多个接口,所有的类都默认继承Object

String ToString();
int GetHashTable()
bool Equals()
bool ReferenceEquals()
Type GetType()
object MemberwiseClone()
woid Finalize()
//以上的是object中的方法

String类

看一个例子,如果有 String a = "ab" + "c"; 那么在这个里面有3块内存空间使用,这样使用效率不高
而这个时候,C#中可以使用StringBuider
那么相应的代码改写为 StringBuider a = new StringBuider...;
a.Append("ab");
a.Append("c");
这儿和java中的StringBuffer是相同的。


代表delegate
代表是包含方法引用的类,具有签名特征,只能包含与签名特征一致的方法的引用,没有成员和方法

定义方法:public delegate void TestDelegate (String k);
 public void Test (String
TestDelegate aDelegate = new TestDelegate(d.Test);
aDeleget("Test");

数组
一维数组 int[] a = new int[]{1, 2, 3};
如果不赋值的话,int[] a = new int[3];

二维数组 int[,] a = new int[,]{{1, 2, 3}, {4, 5, 6}}

锯齿数组 int[][] a = new int[3][];//可能比相同的二维数组的执行效率高
 a[0] = new int[]{1, 2, 3}
 a[1] = new int[]{1, 2, 3, 4}
 a[2] = new int[]{1, 2, 3, 4, 5, 6}


boxing and unboxing

任何值类型和引用类型之间进行转换
对任何类型的值来说都可以看作是Object类型
例如:
Object a;
Object b = a;//隐式
或者Object b = (Object)a;//显式,这儿是装箱

unboxing是不同类型的转换
下面的语句是错误的,String a = 15;
而这样写就是正确的,String a = 15 ToString();

变量
命名规则->以字母开头,由字母,数字和下划线组成,不能与关键字重名(但是可以使用@关键字,例如@using),变量类型为static, instance(随着类的实例结束而结束), array, value, param, reference param, outpu param, local variable

 

常量
声明如下:
modifiers (const) type declaractors
modifiers: new, public, protected, internal, private

隐式类型的转换
从第精度的数值类型到高精度的数值类型转换
整形值不能自动转为char类型
隐式枚举转换允许0转换成任何枚举类型,其他整数不可以的

隐式引用转换
从任何引用类型到对象类型
子类到父类
继承类到接口
子接口道父接口
任何数组到System.Array
任何代表类型到System。Delegate。
任何数组或代表到System.ICloneable
从null到任何引用类型


显示类型转换(数值转换,枚举转换,引用转换)
显式枚举转换
 从数值类型到枚举类型
 从枚举类型到数值类型
 从任何枚举类型到任何枚举类型

显示引用转换
从对象到任何引用类型
从基类到子类
类到接口,并且类没有实现接口
接口到接口,并且没有继承关系
System.Array到数组。
System.Delegate到代表类型
System.ICloneable到数组或代表类型

操作符
在除法运算中,默认的返回值类型与精度最高的操作数类型相同。
两个整数类型的变量相除不能整除,返回不大于相除之值得最大整数。
is:用于动态的检查运行时对象类型是否和给定的类型兼容。
 例如,1.0 is float 返回false
as:将一个值显式转换成指定的引用类型。如果失败,as不会产生异常,结果值为null。
 例如:String a = (String) 5;  // 可能出现异常
       String a = 5 as String; // 不会产生异常,最多就是返回null
       String a = '5' as String -> a = null
typeof
 获得类型,例如,typeof(int)

checked,unchecked
class Test
{
 int x = 1000000;
 int y = 1000000;
 int F()
 {
  return checked( x * y ); //编译错误,抛出异常,超出了int范围,抛出异常
 }
 int G()
 {
  return unchecked( x * y ); //返回值为 -727379968 (自动截掉不符合的那些高位)
 }
 int H()
 {
  return x * y; //依赖于编译的默认情况
 }

class Test
{
 const int x = 1000000;
 const int y = 1000000;
 int F()
 {
  return checked( x * y ); //编译错误
        }
 int G()
 {
  return unchecked( x * y ); //返回 -727379968
        }
  int H()
 {
  return x* y; //编译错误,对于常量,和加上checked效果相同
        }
}


流程控制
if…else…
switch( expression) // case中和java不同的就是,它也可以比较字符串
 {
  case xx:
   break; // 当然也可以使用goto, return等跳转出去的语句
  default: // 必须加上,即使为空
   break;
 }
while
do…while
for
foreach // 对一个集合进行遍历的
例如,
int[] a=new int[5]{1,2,3,4,5};
foreach( int I in a )
{
 Console.WriteLine(“{0}”, I );
}

下面的例子
int[] a=new int[5]{1,2,3,4,5};
int b=0;
foreach( int I in a )
{
 b++;
 Console.WriteLine("{0}, {1}, {2}", I, b, b+I);
}
他的输出结果就是
1, 1, 2
2, 2, 4
3, 3, 6
4, 4, 8
5, 5, 10

异常处理---这儿和java的查不多的
throw
try-catch
try-finally
try-catch-finally
-------------------------------------------------------------------------------

格式为:
modifier Class identifier Class-base

public

protected

internal(本工程内部的)

private

abstract

sealed

--------------

继承
如果继承接口的话,那么后面用":" 后面接的是i开头的接口,当然可以继承多个接口的
className:superClassName, interfaceName1, interfaceName2...

 public class Class2
 {
  public Class2()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }

  public Class2(String s)
  {
  }
 }

 public class Class3 : Class2
 {
  public Class3() : base("asp")
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
 }

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值