做项目需要用到一些c#的知识,学一波顺便mark一下一些和c/c++不太一样的地方
首先有可能第一次打开VS2015的时候找不到创建c#的控制台程序,怎么做呢?
这时候应该打开安装目录下的Common7-IDE文件夹,打开devenv.exe程序,那么就能找到创建控制台的c#程序了
c#中的string类型是你在初始化的时候就固定长度了的,而它的一些常用的操作比如append()方法,erase()方法等一些需要改变原来长度的操作时候,string是会把原来的删除,重新生成的,这样带来的开销是很大的,为此,c#中有另外一个string类型叫StringBuilder,new一个新的StringBuilder()那么就和正常的string一样的用法了。
这里有一个比较特别的方法叫AppendFormat(),它的第一个参数是一个“格式”,“格式”加一个大括号,里面的数字i从0开始计数,对应接下来的第i+1个参数,比如里面的s.AppendFormat("nihao{0} {1}", "gz", "hu"),那么大括号里面的0就是gz,1就是hu对应下来
在实际操作中,可能你使用string和StringBuilder的感觉是差不多的,但是对于电脑的运算来说是不一样的,如果字符串的长度固定好就不再改动,那么推荐使用string,而如果某字符串的长度要经常性的修改,那么推荐使用变长的StringBuilder类型
StringBuilder s = new StringBuilder();
s.Append("asd;jasd");
s.AppendFormat("hello {0}", "world\n");
s.AppendFormat("nihao{0} {1}", "gz", "hu");
Console.WriteLine(s);
方便的数字转字符串函数,字符串转数字函数
在以前做ACM的时候经常有数字字符串需要互转的时候,有点麻烦,而c#提供了一些方法可以直接让两者互相转换
int i = 10;
string s = i.ToString(); //int类型有一个方法叫 ToString()可以直接转成字符串
Console.WriteLine(s);
//字符串有三种方法可以转成int
//调用Convert这个类的ToInt32方法,和调用Int32类的Parse方法,但如果输入的参数不正确的话会直接报错
int j = Convert.ToInt32(s);
Console.WriteLine(j);
int k = Int32.Parse(s);
Console.WriteLine(k);
//Int32的TryParse方法两个参数,第一个是待转换的字符串,第二个是存放的地方
//好处在于如果待转换的字符串不符合规范,那么它也不会报错,而是给p赋值一个默认的0
int p;
bool flag = Int32.TryParse("sdf", out p);
Console.WriteLine(p);
接下来是抽象类和接口的问题
在C#中,一个类可以有多个接口,但只能有一个继承的类。
一个类中的接口必须在这个类中重写接口里面的方法,而继承了抽象类的抽象方法也必须重写。
如果继承了抽象类中,里面的方法不是抽象的方法,那么不需要重写。
接口中不允许有数据段,而抽象类仍然是一个类,可以有数据段和自己的方法。
class Man:Person,ISuper
{
public override int GetAbstract()
{
return 5;
}
public int GetSuper()
{
return 5;
}
}
abstract class Person
{
public string name;
public string Getname()
{
return name;
}
public abstract int GetAbstract();
}
interface ISuper
{
int GetSuper();
}
C#中一些保存集合的数据结构
首先数组和C++类似不介绍,然后是类似于数组的ArrayList和List
ArrayList是弱类型的数据结构,里面可以存放不同数据类型的数据,比较方便,但由于取出数据类型的不确定性,容易发生错误,而List<>是一种强类型的数据结构,创建的时候必须定义好里面存放的是什么数据
//ArrayList是弱类型的数据结构,里面可以保存不同类型的数据
ArrayList a = new ArrayList();
a.Add(5);
a.Remove(5);
a.Add("asduiohasod");
foreach(var i in a)
{
Console.WriteLine(i);
}
List<int> aa = new List<int>();
aa.Add(65);
aa.AddRange(new int[] { 501, 502 });
//寻找value为501的索引
Console.WriteLine(aa.IndexOf(501));
//判断List里是否有501的数据
Console.WriteLine(aa.Contains(501));
aa.Remove(501);
aa.Insert(1, 1001);
Hashtable和Dictionary
Hashtable类似c++里面的map,但同样它是弱类型的,即支持里面存放不同数据类型的数据,访问里面的数据和c++的map是一样的,而Dictionary则是强类型的,如同c++里面的map,需要声明的时候给定存放的数据类型
Hashtable ht = new Hashtable();
ht.Add("hf", "123");
ht.Add(100, 100);
Console.WriteLine(ht["hf"]);
Dictionary<string, string> d = new Dictionary<string, string>();
d.Add("5", "5");
SortedList
类似c++中的set,里面的元素按照key的值大小排序,和插入的顺序无关
SortedList<int, int> s1 = new SortedList<int, int>();
s1.Add(1, 1);
s1.Add(0, 2);
foreach (var i in s1)
Console.WriteLine(i.Key);