c#学习笔记
c#初学写点儿备忘录
console.write();方法不自动添加换行符;
console.Writeline();方法自动添加换行符
在c#中可以使用任意数量的替代标记和任意数量的值
1.值可以以任何顺序使用
2.值可以在格式字符串中替换任意次
Console.writeline(“three integersare{1},{0} and {1}.”,3,6);
输出 three integers are6,3and6
命名空间 类 方法
decimal 准确的表示分数,用于货币的计算 有效数字精度未28位
预定义类型:
用户定义类型 class struct array enum delegate(委托类型) interface(接口类型)
值类型和引用类型:
值类型只需要一段单独的内存,用于存储实际的数据
引用类型需要两段内存 第一段存储实际的数据,总是位于堆当中,第二段是一个引用,指向数据在堆中存放的位置。
dynamic 关键字动态化的静态类型
可空类型 :
形式:例:int? myNint=28;
注意点:
1.可空类型总是基于另外一个已声明类型,此类型名为底层类型
2.可以从任何值类型创建可空类型,包括预定义的简单类型
3.不可以从引用类型或其他可空类型创建可空类型
4.不需要在代码中显式声明可空类型。
5.在非可空类型和可空类型之间存在隐式转化,(不需要强制转换)
6.在可空类型和非可空类型中存在显示转化
7.可空类型的变量值不是NULL值
例:int?myint=1;
int regent=(int) myint1;
类
类:逻辑上相关的数据项和函数的封装集合。
类的声明:
类的名称
类的成员
类的特征
Class firdrt 关键字 类名
{
成员声明
}
类中成员的声明可以引用另一个在后面的类声明中才定义的成员
类中的变量:字段(与c和c++不同,c#在类型的外部不能够声明全局变量。所有的字段都属于类型,而且必需在类型声明内部声明)
类中定义 方法
声明类类型的变量所分配的内存是用来保存引用的(栈),要为实际数据分配内存需要使用new运算符。
例:
Class Smart{………}
Smart www=new www();//申请堆变量
www变量名存储在栈中
访问修饰符 public private protected internal(内部的)protected internal(受保护内部的)
默认访问级别私有访问
类的内部成员可以自由的互相访问
var 关键字只能用于本地变量,不能用于字段;
只能在变量声明中包含初始化时使用
仅为速记
方法中的引用参数:
1. 使用引用参数时,必需在方法的声明和调用中都使用ref修饰符(对形参做的任何更改在对实参上依然有效)
例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class MyClass
{
public int MyInt = 10;
}
class Program
{
static void MyMethod(ref MyClassa,ref int b)
{
a.MyInt=5;
b=6;
}
static void Main(string[] args)
{
MyClass my = new MyClass();
int b = 2;
MyMethod(ref my,ref b);
Console.WriteLine("{0},{1}", my.MyInt, b);
Console.ReadKey();
}
}
}
方法中的输出参数:
在声明和调用中使用out修饰符
例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class MyClass
{
public int MyInt = 10;
}
class Program
{
static void MyMethod(out MyClassa,out int b)
{
a = new MyClass();
a.MyInt = 20;
b = 1;
}
static void Main(string[] args)
{
MyClass my;
int b;
MyMethod(out my,out b);
Console.WriteLine("{0},{1}", my.MyInt, b);
Console.ReadKey();
}
}
}
注:引用参数在输入时需要一个初始值,而输出参数则不需要初始值(且如果有初始值,也会被覆盖掉)
方法中的参数数组:
声明参数数组加修饰符params
例:void listints(paramsint[] invals)
{
……………
}
在调用时不使用修饰符
例:listints(10,20,30);//调用方法1
int []intArray={1,2,3};
listints(intArray);//调用方法2
Class MyClass
{
public void listints(params int [] intvals)
{
If((invals!=null)&&(invals.length!=0))
foreach( int i in intvals)
{ invals[i]=invals[i]*10;
Console.writeline(“{0} ”,invals[i])
}
}
}
ClassProgram{
Staticvoid main()
{
Intfirst = 5,second=6,third=7;
MyClassmc=new MyClass();
mc.listints(first,second,third);
console.writeline(“{0} {1} {2}”,first, second, third);
}
}
此时不改变实参的值,输出 50 60 70 5 6 7
当数组作为实参的时候改变原数组中的值。
int[] MyArr =new int[]{5,6,7 };
MyClass mc=new MyClass();
mc.listlints(MyArr);
方法中的命名参数:可以不按照原来的定义数据为方法赋值
方法中的可选参数:
不是所有的参数类型都可以做为可选参数。
1. 只要值类型的默认值在编译的时候可以确定,就可以使用值类型做为可选参数。
2. 只有在默认值是NULL的时候,引用类型才可以做为可选参数来使用。
3. 声明顺序:必填参数,可选参数,数组参数
4. 省略必需是从最后开始的
5. 与命名参数联合使用可以达到任意省略的效果
方法中的帧栈
方法中的递归