在C#中隐式和显式实现接口有什么区别?
什么时候应该使用隐式?什么时候应该使用显式?
是否有任何利弊和/或缺点?
Microsoft的官方指南(来自第一版框架设计指南)声明不建议使用显式实现,因为它会给代码带来意外行为.
我认为这个指南在IoC之前的时候是非常有效的,当你没有作为接口传递时.
任何人都可以触及这方面吗?
我刚刚浏览了DavidHayden关于哈希用户密码的文章之一.
真的,我无法得到他想要实现的目标.
这是他的代码:
private static string CreateSalt(int size)
{
//Generate a cryptographic random number.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buff = new byte[size];
rng.GetBytes(buff);
// Return a Base64 string representation of the random number.
return Convert.ToBase64String(buff);
}
private static string CreatePasswordHash(string pwd, string salt)
{
string saltAndPwd = String.Concat(pwd, salt);
string hashedPwd =
FormsAuthentication.HashPasswordForStoringInConfigFile(
saltAndPwd, "sha1");
return hashedPwd;
}
Run Code Online (Sandbox Code Playgroud)
有没有其他C#方法来散列密码并添加盐?
我正在尝试编写一个函数来确定两个相等大小的位图是否相同.我现在的功能只是在每个位图中一次比较一个像素,在第一个不相等的像素处返回false.
虽然这可行,并且适用于小位图,但在生产中我将在紧密循环和更大的图像中使用它,所以我需要一种更好的方法.有没有人有任何建议?
我使用的语言就是C# - 是的,我已经在使用.LockBits方法了.=)
编辑:我编写了一些给出的建议的实现,这里是基准测试.设置:两个相同(最坏情况)的位图,大小为100x100,每个迭代次数为10,000次.结果如下:
CompareByInts (Marc Gravell) : 1107ms
CompareByMD5 (Skilldrick) : 4222ms
CompareByMask (GrayWizardX) : 949ms
Run Code Online (Sandbox Code Playgroud)
在CompareByInts和CompareByMask中,我使用指针直接访问内存; 在MD5方法中,我使用Marshal.Copy来检索字节数组并将其作为参数传递给MD5.ComputeHash.CompareByMask只是稍快一点,但考虑到上下文,我认为任何改进都是有用的.
感谢大家.=)
编辑2:忘了打开优化 - 这样做可以让GrayWizardX的答案更加强大:
CompareByInts (Marc Gravell) : 944ms
CompareByMD5 (Skilldrick) : 4275ms
CompareByMask (GrayWizardX) : 630ms
CompareByMemCmp (Erik) : 105ms
Run Code Online (Sandbox Code Playgroud)
有趣的是,MD5方法根本没有改进.
编辑3:发布了我的答案(MemCmp),它将其他方法从水中吹走.OO
我有两个字节数组,内容完全相同.我试过了:
if (bytearray1 == bytearray2) {...} else {...}
Run Code Online (Sandbox Code Playgroud)
和
if (Array.Equals(bytearray1, bytearray2)) {....} else {...}
Run Code Online (Sandbox Code Playgroud)
一直到别的地方!我不知道为什么!我手动检查了两个阵列!
我正在检查两个字节数组的相等性,我想要一些帮助,因为即使数组应该相等,我也会返回false.
在我的调试中,我可以看到a1和b1都相等,但是它不会进入while循环来增加i.
public bool Equality(byte[] a1, byte[] b1)
{
int i;
bool bEqual;
if (a1.Length == b1.Length)
{
i = 0;
while ((i < a1.Length) && (a1[i]==b1[i]))
{
i++;
}
if (i == a1.Length)
{
bEqual = true;
}
}
return bEqual;
}
Run Code Online (Sandbox Code Playgroud)
这总是返回false : (a1[i]==b1[i]).
假设您正在调用将填充字节数组的Win32函数.您创建一个大小为32的数组,为空.然后将其传递给Win32函数以填充int,稍后在托管代码中使用它.字节数组是否有可能在分配时被移动或覆盖,并且由Win32函数填充?
我希望能够从Byte []转换为Image,反之亦然.
我从这里开始这两种方法:
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
public Image byteArrayToImage(byte[] byteArrayIn)
{
MemoryStream ms = new MemoryStream(byteArrayIn);
Image returnImage = Image.FromStream(ms);
return returnImage;
}
Run Code Online (Sandbox Code Playgroud)
他们似乎工作,但如果我这样做:
byte[] pic = GetImageFromDb();
bool result = pic == imageToByteArray(byteArrayToImage(pic));
Run Code Online (Sandbox Code Playgroud)
我明白了result = false!
有没有办法纠正这种方法或一些不同的功能来实现我的目标?
谢谢!
我使用.NET 3.0在C#中有两个字节数组.
比较两个字节数组是否包含每个元素的相同内容的"最有效"方法是什么?
例如,字节数组{0x1, 0x2}与{0x1, 0x2}.但字节数组{0x1, 0x2}和字节数组{0x2, 0x1}不一样.
是否可以在VC++ 10.0中链接VC6的MSVCRT.DLL?
默认情况下,它似乎与MSVCR100.DLL进行连接,但我不想再分发另一个DLL(MSVCRT.DLL已经可以在每一个,我支持OS).
== ==编辑
澄清一下:我的应用程序是一个纯C应用程序,它可以调用WinAPI.我确实理解做C++将需要C++运行时,默认情况下它不捆绑在Windows中(并且最有可能必须匹配编译器).我的问题是关于纯C的使用,以及我目标的最早版本的Windows中存在的CRT功能.
我最近开始玩C#,我试图理解为什么下面的代码不能编译.在错误评论的行上,我得到:
无法将类型'int'隐式转换为'char'.显式转换退出(您是否错过了演员?)
我正在尝试使用两个字符串进行简单的XOR操作.
public string calcXor (string a, string b)
{
char[] charAArray = a.ToCharArray();
char[] charBArray = b.ToCharArray();
char[] result = new char[6];
int len = 0;
// Set length to be the length of the shorter string
if (a.Length > b.Length)
len = b.Length - 1;
else
len = a.Length - 1;
for (int i = 0; i < len; i++) {
result[i] = charAArray[i] ^ charBArray[i]; // Error here
}
return new string (result);
}
Run Code Online (Sandbox Code Playgroud)