在命名空间区域中使用using使用其它的命名空间,如果两个命名空间都存在同样的类名,会优先本命名空间区域内的且不会发生冲突。
namespace XLCH { using XZMJ; public UICard card; }
例如上面的例子,UICard在XLCH存在且在XZMJ也存在,将会使用的是XLCH自家命名空间的,和XZMJ的不发生冲突,不用在类名前指定命名空间。
public static string CalMd5(byte[] datas) { //功能类 在System.Security.Cryptography命名空间中 MD5 md5 = new MD5CryptoServiceProvider(); byte[] ret = md5.ComputeHash(datas); StringBuilder sb = new StringBuilder(); for (int i = 0; i < ret.Length; i++) { //表示占两个字符的16进制 sb.Append(ret[i].ToString("x2")); } return sb.ToString(); }
private static void CopyDirectory(string sourceDirPath, string saveDirPath) { try { if (!Directory.Exists(saveDirPath)) { Directory.CreateDirectory(saveDirPath); } //复制文件 string[] files = Directory.GetFiles(sourceDirPath); foreach (string file in files) { string pFilePath = saveDirPath + "/" + Path.GetFileName(file); if (File.Exists(pFilePath)) continue; File.Copy(file, pFilePath); } //递归调用文件夹复制 string[] dirs = Directory.GetDirectories(sourceDirPath); foreach (string dir in dirs) { CopyDirectory(dir, saveDirPath + "/" + Path.GetFileName(dir)); } } catch (Exception e) { UnityEngine.Debug.LogError(e.ToString()); } }
在网上看到的有一大堆解析,有什么前者对比栈中的值,后者对比堆中的内容的,或者是说对比什么地址的,对比内容的,我靠,真的被绕成煞笔了。
在不考虑所有的重写的情况下,==和equal其实是不是相同的!
object a = new object(); object b = new object(); Console.WriteLine(a == b);//false Console.WriteLine(a.Equals(b));//false int i = 1; int ii = 1; Console.WriteLine(i == ii);//true Console.WriteLine(i.Equals(ii));//true Console.ReadKey();
从上面例子中,引用类型和值类型的==和equal对比结果都是一样的,据我猜测都是对比的栈中的数据,不管是地址还是数值或者其他,反正就是直接对比的栈数据,一样就是true,不一样就是false,应该没有那么复杂。
a和b栈中保存的是两个不同的地址,所以它们不相等;i和ii栈中的数据都是1,所以它们是相等的。
如果想要其它方式的对比,可以重写Equal方法或则重载==,定制成你想咋样就咋样,想对比引用数据的内容就对比内容。最明显的例子就是String类型,它是一个引用类型,但是它重载了==和重写了Equal,实际对比的是字符串中的每一个字符。
在VS的工具->扩展和更新中选择联网搜索NUnit,下载这三个:
创建项目,引入NUit.Framework.dll,你可以在安装NUint的目录中找到它,也可以在NuGet中获取它
引入后,右键项目,添加-》新建项-》Test-》NUnit Test Fixture,你就会创建一个单元测试的文件
[TestFixture]//表示这个类为单元测试类 public class TestClass1 { Program p = new Program();//我需要测试的类 [Test]//标志方法为单元测试方法 public void TestMethod() { for (int i = 0; i < 100000000; i++) { p.IsValid(i);//我的测试方法 } Assert.Pass("Your first passing test");//表示测试通过 } }
Assert断言确定测试的通过还是不通过
好了,在菜单测试-》窗口-》测试资源管理器,打开测试窗口
你可以全部运行,也可以在测试类中,右键测试方法-》运行测试,单独测试一个方法。
public delegate void TestDeleteType(); class Program { private static TestDeleteType dd = null; static void Main(string[] args) { dd = Delegate.Combine(dd, new TestDeleteType( HaHa1)) as TestDeleteType; dd();//HaHa1 Action a = null; a = Delegate.Combine(a, new Action(HaHa1)) as Action; a();//HaHa1 //a = Delegate.Combine(a, dd) as Action; 异常,必须要有相同的类型 //a(); Console.ReadKey(); } static void HaHa1() { Console.WriteLine("HaHa1"); } }
可以使用Delegate.Combine()整合多个同一样类型的委托,可以看出作为参数的委托是可以为空的,返回一个Delegate类型,需要自己转换一下
也可以使用+直接联合委托,注意委托类型一定需要一致,如果有返回值,就只返回最后注册的函数的返回值。
[AttributeUsage(AttributeTargets.Field|AttributeTargets.Class, Inherited = true, AllowMultiple = true)] public class MyAttribute:Attribute { public int Index; public MyAttribute(int index) { Index = index; } } [My(250)]//特性允许类和属性的使用 class Class1 { [My(0)][My(1)]//AllowMultiple允许多个 public int A; [My(2)] public bool B; } class Class2 : Class1 { //Inherited允许类继承特性内容,false时不会有Class1的特性 } static void Main(string[] args) { //通过反射获取特性的类容,根据实际需要做不同处理 Type t = typeof(Class1); MyAttribute attribute = t.GetCustomAttribute(typeof(MyAttribute)) as MyAttribute; Console.WriteLine("Class1的特性Index:" + attribute.Index); FieldInfo[] fieldInfos = t.GetFields(); foreach (var i in fieldInfos) { object[] mys = i.GetCustomAttributes(false); foreach (var j in mys) { MyAttribute my = j as MyAttribute; Console.WriteLine(i.Name + "的特性Index:" + my.Index); } } Console.WriteLine();Console.WriteLine("继承的类也有特性"); t = typeof(Class2); attribute = t.GetCustomAttribute(typeof(MyAttribute)) as MyAttribute; Console.WriteLine("Class2的特性Index:" + attribute.Index); fieldInfos = t.GetFields(); foreach (var i in fieldInfos) { object[] mys = i.GetCustomAttributes(false); foreach (var j in mys) { MyAttribute my = j as MyAttribute; Console.WriteLine(i.Name + "的特性Index:" + my.Index); } } Console.ReadKey(); }
都挺简单的,解析看注释,输出:
Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine(s); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(s1);
只能设置,ConsoleColor枚举里面的颜色。
DataTable table = new DataTable(); Console.WriteLine(exp + "=" + table.Compute(exp, ""));
int a = 100; string a16 = Convert.ToString(a, 16) ; Console.WriteLine("100的二进制:"+Convert.ToString(a, 2));//ToString的第二个参数表示为进制的基数 Console.WriteLine("100的八进制:"+Convert.ToString(a, 8)); Console.WriteLine("100的十六进制:"+a16); Console.WriteLine("16进制转换回10进制:"+Convert.ToInt32(a16, 16));