我在调查String.Concat :(反射器)

很奇怪 :
有值数组,
他们创造了一个新的阵列,以后他们会把他送到ConcatArray.
题 :
为什么他们创建了一个新阵列?他们values从一开始......
代码:
public static string Concat(params string[] values)
{
if (values == null)
{
throw new ArgumentNullException("values");
}
int totalLength = 0;
string[] strArray = new string[values.Length];
for (int i = 0; i < values.Length; i++)
{
string str = values[i];
strArray[i] = (str == null) ? Empty : str;
totalLength += strArray[i].Length;
if (totalLength < 0)
{
throw new OutOfMemoryException();
}
}
return ConcatArray(strArray, …Run Code Online (Sandbox Code Playgroud) 我不明白.该As操作:

那为什么以下工作呢?
struct Baby : ILive
{
public int Foo { get; set; }
public int Ggg()
{
return Foo;
}
}
interface ILive
{
int Ggg();
}
void Main()
{
ILive i = new Baby(){Foo = 1} as ILive; // ??????
Console.Write(i.Ggg()); // Output: 1
}
Run Code Online (Sandbox Code Playgroud)
Baby是一个结构,创建它将把价值放入stack.这里没有参考.
这里肯定没有可空类型.
关于我为什么错的任何解释?
$("#dataTable tbody").on("click", "tr", function(event){
alert($(this).text());
});
Run Code Online (Sandbox Code Playgroud)
这个语法是针对已经在页面上的tr吗?
如果没有,未来tr元素的语法是什么?
根据MSDN:
volatile关键字表示某个字段可能被同时执行的多个线程修改.声明为volatile的字段不受编译器优化的约束,这些优化假定由单个线程进行访问.这可确保始终在字段中显示最新值.
请注意最后一句:
这可确保始终在字段中显示最新值.
但是,此关键字存在问题.
我已经读过它可以改变指令的顺序:
Run Code Online (Sandbox Code Playgroud)First instruction Second instruction Can they be swapped? Read Read No Read Write No Write Write No Write Read Yes! <----
这意味着John为一个易变的字段设置了一个值,后来 Paul想要阅读该字段,Paul正在获得旧的价值!
这是怎么回事?这不是主要的工作吗?
我知道还有其他解决方案,但我的问题是关于volatile关键字.
我(作为程序员)是否需要阻止使用此关键字 - 因为这种奇怪的行为?
我正在使用Redis-server for windows(2.8.4 - MSOpenTech)/ windows 8 64bit.
它工作得很好,但即使在我运行之后:

我明白了:( 这是我的问题)

题 :
- 我不是只是告诉它擦除所有数据库?那么为什么那些2/3巨大的文件仍然存在呢?我怎样才能完全删除这些文件?(不重新生成)
NB似乎它正在删除密钥而不释放占用的空间.如果是这样,我如何释放这个未使用的空间?
我有一个winform代码,点击按钮后运行:
void button1_Click(object sender, EventArgs e)
{
AAA();
}
async Task BBB( int delay)
{
await Task.Delay(TimeSpan.FromSeconds(delay));
MessageBox.Show("hello");
}
async Task AAA()
{
var task1 = BBB(1); // <--- notice delay=1;
var task2 = BBB(1); // <--- notice delay=1;
var task3 = BBB(1); // <--- notice delay=1;
await Task.WhenAll(task1, task2, task3);
}
Run Code Online (Sandbox Code Playgroud)
题 :
为什么我一次看到一个MessageBox delay=1:
但如果我改变延迟:1,2,3-
var task1 = BBB(1);
var task2 = BBB(2);
var task3 = BBB(3);
Run Code Online (Sandbox Code Playgroud)
我看到 - 3个消息框甚至没有点击任何消息框?
我在这里读了一些答案(例如),其中一些人说并行性不会提高性能(可能在读取IO中).
但是我创建了一些测试,表明WRITE操作也要快得多.
- 阅读测试:
我用伪数据创建了随机6000文件:
让我们尝试用w/o并行性来阅读它们:
var files =
Directory.GetFiles("c:\\temp\\2\\", "*.*", SearchOption.TopDirectoryOnly).Take(1000).ToList();
var sw = Stopwatch.StartNew();
files.ForEach(f => ReadAllBytes(f).GetHashCode());
sw.ElapsedMilliseconds.Dump("Run READ- Serial");
sw.Stop();
sw.Restart();
files.AsParallel().ForAll(f => ReadAllBytes(f).GetHashCode());
sw.ElapsedMilliseconds.Dump("Run READ- Parallel");
sw.Stop();
Run Code Online (Sandbox Code Playgroud)
结果1:
运行READ- Serial 595
运行READ-Parallel 193
结果2:
运行READ- Serial 316
运行READ-Parallel 192
- 写测试:
要创建1000个随机文件,每个文件为300K.(我从prev test中清空了目录)
var bytes = new byte[300000];
Random r = new Random();
r.NextBytes(bytes);
var list = Enumerable.Range(1, 1000).ToList();
sw.Restart();
list.ForEach((f) => WriteAllBytes(@"c:\\temp\\2\\" + Path.GetRandomFileName(), bytes));
sw.ElapsedMilliseconds.Dump("Run WRITE serial");
sw.Stop();
sw.Restart();
list.AsParallel().ForAll((f) => WriteAllBytes(@"c:\\temp\\2\\" …Run Code Online (Sandbox Code Playgroud) 根据msdn
IStructuralEquatable
定义支持结构对等比较的方法.结构相等意味着两个对象是相等的,因为它们具有相等的值.它与引用相等不同,后者表示两个对象引用相同,因为它们引用相同的物理对象.
不是它什么Equals应该怎么做?(当覆盖时IEquatable)?
我有很多次输入文字,
如果它是空的(用户没有输入任何文本) - 我想发送到数据库查询"null"
而不是 String.Empty.(或"")
所以我发现自己做了很多这样的事情:
var mySqlValue = string.IsNullOrEmpty( tbCustomerId.Text)?null:tbCustomerId.Text;
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很难看.
.net为相反的场景提供了许多其他解决方案:
string.IsNullOrEmpty
string.IsNullOrWhiteSpace
myProblemVal ?? myDefultVal
Run Code Online (Sandbox Code Playgroud)
我知道这可以通过扩展方法解决 - 我知道如何做到这一点..
但有什么更好的吗?
是否有任何智能代码:" if its empty -> null".
为什么C#会允许这样:
public class MyClass
{
static int A=1;
static int B=A+1;
}
Run Code Online (Sandbox Code Playgroud)
但是不允许("字段初始值设定项不能引用非静态字段,方法或属性")这个
public class MyClass
{
int A=1;
int B=A+1;
}
Run Code Online (Sandbox Code Playgroud)
我认为它的 顺序是连续的初始化为它出现这是保证(静态字段),但它也应用在这里你可以看到:
public class MyClass
{
int A=((Func<int>)(delegate(){ Console.WriteLine ("A"); return 1;}))();
int B=((Func<int>)(delegate(){ Console.WriteLine ("B"); return 2;}))();
int C=((Func<int>)(delegate(){ Console.WriteLine ("C"); return 3;}))();
}
void Main()
{
var a = new MyClass();
}
Run Code Online (Sandbox Code Playgroud)
结果:
A
B
C
Run Code Online (Sandbox Code Playgroud)
题
我对它被限制的原因/逻辑更感兴趣.只是为了好奇.
nb没有发现任何重复.
c# ×8
.net-4.0 ×3
.net ×2
as-operator ×1
async-await ×1
casting ×1
equals ×1
jquery ×1
redis ×1
redis-server ×1
string ×1
volatile ×1
windows ×1
winforms ×1