c#学习笔记——2

来源:互联网 发布:ipad无法下载软件 编辑:程序博客网 时间:2024/05/21 07:10
静态与非静态复习:
反复使用最好用静态(避免反复编译)




接口:
接口定义:    interface 接口名{接口成员}     
接口的存在就是为了实现多态
接口成员可以是:方法、属性、索引、事件声明 (与方法有关)
方法写法: 返回类型 方法名(参数列表); 
和抽象类的使用一样,必须要实现这个接口中的方法
实现接口的类的方法不需要加overwrite
例子:
interface Ihaha
{
   void Haha();
   void HaHa(int num);
}


保证实现接口的类中的接口定义方法即可
如果这个类是一个抽象类,那么可以将接口中的方法实现,也可以将其作为一个抽象方法。
如果不是抽象的,就必须实现方法过程。




属性定义:
返回类型 属性名{选择器}  如:
interface IProperity
int Num
{
get;
set;
}
class MyTest1:IProperity
{
int num;
public int Num
{
     get{return num;}
     set{num=valuel;}
}
}


例子


    interface IProperity 
    {
        // 返回类型 属性名 { 选择器 }
        int Num
        {
            get;
            set;
        }
        // 在接口中属性具有只读属性与只写属性之分
        int Num1
        {
            get;
        }
        int Num2
        {
            set;
        }
    }
    class MyTest1 : IProperity
    {
        // 实现接口的时候一般情况需要添加一个字段
        int num;
        public int Num
        {
            get
            {
                return num;
            }
            set
            {
                num = value;
            }
        }




        public int Num1
        {
            get { return num; }
        }


        public int Num2
        {
            set { num = value; }
        }
    }

总结:
接口内成员的定义没有访问修饰符,都是返回类型开头+名字+();没有方法体 如int Fun();
实现接口类中,成员的实现。方法实现与正常类一样没有overwrite如:public int Fun(){}; 属性的实现一般要加一个字段。
(显示实现接口没有访问修饰符)

抽象类内成员定义在正常基础上加abstract如public abstract void Fun();
子类中实现父类抽象成员时,方法在正常基础上加overwrite如public overwrite void Fun(){};属性的实现一般要加一个字段,也要overwrite。



显示实现接口,语法
返回类型 接口名.方法名(参数)
{
方法体
}
可以知道显示实现接口方法没有访问修饰符(怎么调用)
显示实现接口只能通过接口进行调用
显示实现接口例子:
interface IF1
    {
        void Func();
    }
    interface IF2
    {
        void Func();
    }
    class MyClass : IF1, IF2
    {
        void IF1.Func()
        {
            Console.WriteLine("接口1的方法");
        }


        void IF2.Func()
        {
            Console.WriteLine("接口2的方法");
        }
    }


调用时:MyClass m1 = new MyClass();
            IF1 f1 = m1;
            f1.Func();


            IF2 f2 = m1;
            f2.Func();






ref在使用前要赋值,out在方法中要赋值。(ref与out区别)




try cach finally  (即使catch里面有return语句,还是会执行finally里的语句)

finally里面不能有return语句。

装箱与拆箱是什么    
答:装箱:值类型转换为引用类型    拆箱:引用类型转换为值类型

多态的实现有哪几种方式    
1. 父类实现多态  
2. 抽象类实现多态    
3.接口实现多态    


CLR (common language runtime)  公共语言运行库


刚刚生成的对象都叫0代
回收一次,那些没有被回收的对象就变成1代
对于1代再回收一次,那些没有被回收的对象就变成2代
每一代都有一个内存大小







异常:
1.如何抛出异常       throw new Exception(”异常信息“);异常是个对象需要new出来。
2.异常抛哪里去了      异常抛给调用它的方法,如果该方法没有处理异常,就再上抛(调用它的方法)
                        如果做了异常处理,就不再往上抛了
try{}     //多个方法嵌套调用时,try catch写在主函数中。
catch{}


try{} 
catch{}
finally{}


try{}     一个用到的例子:嵌套调用方法中,某一个子方法中finally中加入释放资源的代码,出现异常时就可以释放资源了。否者将执行住函数的catch代码,不会释放资源。
finally{}  

例子:


    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Func1();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadKey();
        }


        public static void Func1()
        {
            // 如果该方法中用到一个资源需要被回收
            try
            {
                Func();
            }       
            finally
            {
                Console.WriteLine("释放资源");
            }
        }


        public static void Func()
        {
            throw new Exception("123");
        }
    }



字符串的定义:
1. string str="我是一个字符串";
2. char[] chars ={'1','一','壹'};


string str1=new str(chars);


3.string str2=new string('c',3);


//字符串可以当做数组进行遍历
 for (int i = 0; i < str.Length; i++)
            {
                Console.WriteLine(str[i]);
            }


字符串与char[]数组相互转换的一个例子:
将string str="我是一个字符串";改为str="你是一个字符串";
思路:
转化为char[]数组,然后再修改。
      
         char[] chs = str.ToCharArray();
               chs[0] = '你';
               str = new string(chs); 


          

//字符串不可变的
       string str = "1234";
       tring str1 = str;
       str = "456";


       Console.WriteLine(str);  //输出456
       Console.WriteLine(str1); //输出1234


字符串统一,再比较
//将字符串进行大小写变化
大小写:
string str1 = "a";
str1=str1.ToUpper();
str1=str1.ToLower();


字符串的比较:Compare
//int string.Compare(str1, str2)
// str1 > str2    返回1
// str1 = str2    返回0
// str1 < str2    返回-1
            
int res = string.Compare(str1, str2, true);   第三个参数为true则比较时忽略大小写,为false则不忽略。


 字符串的比较: Equals
 bool str.Equals(str1);
 bool string.Equals(str1,str2);相等则true,否则false。
 bool isRight = str1.Equals(str2, StringComparison.OrdinalIgnoreCase); 忽略大小写。
 
去掉两端的字符Trim()
string str = "   123   ";
string str1 = str.Trim();//str1="123";


string stemp = "[12345]";
string stemp1 = stemp.Trim(']', '[');stemp1 = "12345";
扩展的方法TrimEnd   TrimStart   只去掉后端或前端的字符


 合并  将object类型的数组,用指定的字符串连接,返回一个字符串
 string[] strs = { "梅西", "卡卡", "郑大世" };
梅西|卡卡|郑大世
string.Join(分隔符, 数组) 
string str = string.Join("|", strs);




 分割 将字符串用指定的params char[] 进行分割。(或 string[])进行分割,返回一个string[]。   有2个或以上重载参数时均没有params
// string[] str.Split(需要分割的符号);
//string path = @"C:\Windows\System32\1.dll";
//string[] pathes = path.Split('\\'); 


string str = "I am a student! how are you!";
string[] strs1 = str.Split(new char[] { ' ', '!' }, StringSplitOptions.RemoveEmptyEntries);  //返回值不包含空字符串的数组。


查找
Contains
bool str.Contains("要找的字符串");
例如
string str = @"D:\Music\孙燕姿_专辑\孙燕姿_天黑\孙燕姿_专辑\孙燕姿_\孙燕姿_专辑\孙燕姿_天黑黑天黑黑黑.mp3";
bool isRight = str.Contains("孙燕子");


//IndexOf   (字符或字符串均可 )
int str.IndexOf("要找的东西")


int index = str.IndexOf("孙燕子");
默认情况下从字符串开始进行查找,找到第一个结束,返回位置
可以使用第二个参数,表示从字符串的第几个字符开始寻找
如果没有找到就返回-1 
下面是典型用法:找到所有"孙燕姿"所在的索引下标
int index=-1;
do
{
index=str.IndexOf("孙燕姿",index+1);
if(index!=-1)
{
Console.WriteLine(index);
}
}
while(insex!=-1);




拓展:IndexOfAny,传入字符数组,只要找到数组中任意一个则返回。
  char[] nums = {'1','2','3','4','5','6'};
  int index = str.IndexOfAny(nums,4);
  
  
 Substring() :截取子字符串
1、string str.Substring(index)
 从index开始到结束的所有部分
  string path = @"D:\Music\孙燕姿_天黑黑.mp3";
int index = path.LastIndexOf('\\');  //从后往前找'\'。
string temp = path.Substring(index + 1);//找到文件名


2、string str.Substring(index, Length); //截取指定索引下标处开始的指定长度
string data = "2012年6月29日";
int index = data.IndexOf('月');
string temp = data.Substring(index + 1, 2);


例子:
       string str = "我是一个走马灯";
while (true)
{
    Console.Clear();
string head = str[0].ToString();
string body = str.Substring(1);
str = body + head;
Console.WriteLine(str);
System.Threading.Thread.Sleep(200);
}
System.Threading.Thread.Sleep(100);让程序停止100ms。




插入:Insert 指定处插入指定的字符串(第一个参数为插入后指定字符串的索引)。


tring str = "012345";
str = str.Insert(3, "我");


删除:与substring使用参数一样,作用是删除指定索引下标处,(指定长度的元素)。
str = str.Remove(3,1);




            判断开始与结尾
             比如检查是否为MP3歌曲
            string path = @"D:\123\456\happy2000.wma";
            if (path.EndsWith(".mp3"))
            {
                Console.WriteLine("是MP3");
            }
            else
           {
                Console.WriteLine("不是mp3");
           }


            // path.StartsWith("")




总结:
数组转字符串:
new string(char[]类型数组)
string.Join(字符串分隔符, object数组)


字符串转数组:
str1.ToCharArray () 返回char[]
str1.Split (params char[])   返回string[]







原创粉丝点击