在我的数据库中,在其中一个表中,我有一个GUID列,其中包含allow nulls.我有一个Guid的方法?在表中插入新数据行的参数.但是,当我说myNewRow.myGuidColumn = myGuid时,我收到以下错误:"无法隐式转换类型'System.Guid?' 到'System.Guid'."
如果你想收到GC的通知(例如,转移收集过程中的节点之间的负载),那么你可以使用的方法,三人GC.RegisterForFullGCNotification
,GC.WaitForFullGCApproach
和GC.WaitForFullGCComplete
-然而,通过参数GC.RegisterForFullGCNotification
在很大程度上似乎是毫无意义的,并没有现实世界的指导给出了如何选择合适的价值观.有模糊的音符,像从这里:
使用以下准则指定maxGenerationThreshold和largeObjectHeapThreshold参数:
阈值越大,收集可能发生的时间越远,通知越快.
较大的阈值为运行时提供了更多检查即将到来的集合的机会.这会增加您收到通知的可能性.但是,您不应将阈值设置得太高,因为这会导致在运行时导致下一个集合之前等待更长时间.
当您使用高阈值通知自己诱导集合时,将回收更多的对象,而不是运行时的下一个集合回收的对象.
阈值越小,收集更快发生的可能性越大,通知将在稍后提出.
或者从这里开始
maxGenerationThreshold
1到99之间的数字,指定何时应根据第2代中提升的对象引发通知.
largeObjectHeapThreshold
1到99之间的数字,指定何时应根据在大对象堆中分配的对象引发通知.如果指定的值太高,则很可能会收到通知,但在运行时导致收集之前等待的时间可能太长.如果您自己引导集合,则可能会回收更多的对象,而不是运行时导致集合的回收对象.
如果指定的值太低,则运行时可能会在您有足够的时间通知之前导致收集.
然而,这并没有真正帮助我选择合理/正确的数字,除了"不太高,不太低".
目前,我只是使用少数提供的示例中的一个,即
// these are magic numbers; nobody really knows what they mean...
GC.RegisterForFullGCNotification(10, 10);
Run Code Online (Sandbox Code Playgroud)
但是......很不清楚10
,10
是一个正确的选择,一个任意的选择,或者我应该如何改变它以反映任何特定的使用场景.
那么:有没有正确的方法来选择这些数字?或者它是否只是反复试验,取决于我是否过早/迟到了事件?
试图让我的思绪围绕谷歌protobuf.我在C#中发现了一些protobuf的实现,但它们似乎缺少一个功能:能够从使用属性修饰的现有C#类自动生成.proto文件.
我想这样做而不是从.proto文件中自动生成的C#类的原因是因为我已经在我的项目中定义了C#类,我不想复制它们只是为了满足ProtoBuf.
有没有人遇到过这种情况?
更新
这可能只是装饰一个C#类而不是使用.proto文件来使用protobuf吗?
想象一下,我们有一个可变的struct
(是的,不要开始):
public struct MutableStruct
{
public int Foo { get; set; }
public override string ToString()
{
return Foo.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
使用反射,我们可以获取一个盒装实例,struct
并在框内变异:
// this is basically what we want to emulate
object obj = new MutableStruct { Foo = 123 };
obj.GetType().GetProperty("Foo").SetValue(obj, 456);
System.Console.WriteLine(obj); // "456"
Run Code Online (Sandbox Code Playgroud)
我会喜欢做的是写一些IL可以做同样的,因为这-但速度更快.我是一个元编程迷; p
拆箱 - 任何值并使用常规IL改变值是微不足道的 - 但是你不能只是在之后调用它,因为这将创建一个不同的框.我猜我们需要做的是将它复制到现有的盒子上.我已经调查了ldobj
/ stobj
,但那些似乎没有做到这一点(除非我遗漏了什么).
那么:是否存在这样做的机制?或者我必须限制自己反思以执行盒装struct
s 的就地更新?
换句话说:什么... evil goes here...
?
var method = …
Run Code Online (Sandbox Code Playgroud) 我有以下代码,但是当我输入"12"时,我仍然得到"你是一个老人".不是9 - 15号码9到15号吗?如何处理一个案例的多个值?
int age = Convert.ToInt32(txtBoxAge.Text);
switch (age)
{
case 1 - 8:
MessageBox.Show("You are only " + age + " years old\n You must be kidding right.\nPlease fill in your *real* age.");
break;
case 9 - 15:
MessageBox.Show("You are only " + age + " years old\n That's too young!");
break;
case 16-100:
MessageBox.Show("You are " + age + " years old\n Perfect.");
break;
default:
MessageBox.Show("You an old person.");
break;
}
Run Code Online (Sandbox Code Playgroud) 当词典中不存在键时返回的[string]
索引器是什么Dictionary
?我是C#的新手,我似乎找不到像Javadocs那样好的参考.
我得到了null
,还是我得到了例外?
是否可以枚举C#中的所有托管线程?当您在调试时遇到断点时,Visual Studio似乎能够执行此操作.在"线程"窗口中,它显示所有正在运行的线程的列表,包括托管名称.有谁知道这是怎么回事?
我已经阅读过(或者从同事那里听到)在.NET中,TransactionScope可以达到超时,然后是VoteCommit(而不是VoteRollback).这是准确还是传闻?我无法在网上找到谈论这个问题的信息(如果这是一个问题),所以我想知道是否有人有任何直接的经验,可以解决一些问题?
我确定我以前做过这个,但找不到任何例子!哎呀...
例如,我想将IList<T>
a 转换为BindingList<T>
:
public class ListHelper
{
public static BindingList<T> ToBindingList(IList<T> data)
{
BindingList<T> output = new BindingList<T>();
foreach (T item in data)
output.Add(item);
return output;
}
}
Run Code Online (Sandbox Code Playgroud) 人们普遍接受(我相信!)a lock
会强制重新加载字段中的任何值(基本上充当内存屏障或栅栏 - 我在这方面的术语有点松散,我害怕),结果那些只能在一个内部访问过的字段lock
本身并不需要volatile
.
(如果我错了,就说!)
这里提出了一个很好的评论,质疑如果代码执行是否也是如此Wait()
- 即一旦它已经Pulse()
d,它将从内存重新加载字段,还是可以在寄存器(等)中.
或者更简单:该字段是否需要volatile
确保在a后恢复时获得当前值Wait()
?
看着反射器,Wait
召唤进入ObjWait
,这是managed internalcall
(相同 Enter
).
有问题的情景是:
bool closing;
public bool TryDequeue(out T value) {
lock (queue) { // arbitrary lock-object (a private readonly ref-type)
while (queue.Count == 0) {
if (closing) { // <==== (2) access field here
value = default(T);
return false;
}
Monitor.Wait(queue); // <==== (1) waits here
} …
Run Code Online (Sandbox Code Playgroud) c# ×9
.net ×6
case ×1
dictionary ×1
generics ×1
guid ×1
ilgenerator ×1
monitor ×1
nullable ×1
protobuf-net ×1
sql-server ×1
transactions ×1
volatile ×1