我在这里和Eric Lippert的Ref<T>班级玩了一下.我注意到在IL中看起来两个匿名方法都使用相同的生成类,即使这意味着类有一个额外的变量.
虽然只使用一个新的类定义似乎有点合理,但我觉得只<>c__DisplayClass2创建一个实例非常奇怪.这似乎暗示两个实例Ref<T>都引用相同的<>c__DisplayClass2 意思并不意味着y在收集之前无法vart1收集,这可能比joik返回之后发生得晚得多?毕竟,不能保证一些白痴不会写一个直接y通过vart1aftrer joik返回的函数(直接在IL中).也许这甚至可以通过反射而不是疯狂的IL来完成.
sealed class Ref<T>
{
public delegate T Func<T>();
private readonly Func<T> getter;
public Ref(Func<T> getter)
{
this.getter = getter;
}
public T Value { get { return getter(); } }
}
static Ref<int> joik()
{
int[] y = new int[50000];
int x = 5;
Ref<int> vart1 = new Ref<int>(delegate() { return x; });
Ref<int[]> vart2 …Run Code Online (Sandbox Code Playgroud) 根据http://www.codeguru.com/forum/showthread.php?t=463663,3.5中的C#getHashCode功能实现为:
public override unsafe int GetHashCode()
{
fixed (char* str = ((char*) this))
{
char* chPtr = str;
int num = 0x15051505;
int num2 = num;
int* numPtr = (int*) chPtr;
for (int i = this.Length; i > 0; i -= 4)
{
num = (((num << 5) + num) + (num >> 0x1b)) ^ numPtr[0];
if (i <= 2)
{
break;
}
num2 = (((num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr[1]; …Run Code Online (Sandbox Code Playgroud) 在实现表值参数时,生成IEnumerable<SqlDataRecord>参数使用的最常见方法之一是这样的代码(例如,https://stackoverflow.com/a/10779567/18192):
public static IEnumerable<SqlDataRecord> Rows(List<int> simpletable)
{
var smd = new []{ new SqlMetaData("id", SqlDbType.Int)};
var sqlRow = new SqlDataRecord(smd);
foreach (int i in simpletable)
{
sqlRow.SetInt32(0, i);
yield return sqlRow;
}
}
//...
var param = sqlCmd.Parameters.AddWithValue("@retailerIDs", Rows(mydata));
param.SqlDbType = SqlDbType.Structured;
param.TypeName = "myTypeName";
Run Code Online (Sandbox Code Playgroud)
这段代码似乎确实有效.虽然重用SqlMetaData并没有引发太多的警钟,但声明SqlDataRecord外面的foreach循环让我感到非常怀疑:
修改可变对象,然后重复生成.
作为一个关于这个问题的一个例子,var x = Rows(new[] { 100, 200}.ToList()).ToList().Dump()在LinqPad中调用吐出来200,200.这种方法似乎依赖于实现细节(行是单独处理的),但我没有看到任何承诺这样做的文档.
是否有一些减轻因素使这种方法安全?
我在Internet Explorer 7/8下遇到以下问题:
我有一个弹出窗口,当用户鼠标悬停链接时会被激活.弹出窗口是一个简单的<div>包含一些数据.在这个<div>标签里面有一个<select>带有<option>s 的标签.我已将mouseover/mouseout事件附加到<div>,这样当光标在它上面时,此弹出窗口将保持打开状态.当您单击<select>然后将光标移动到任何<option>s上时,会出现问题.这会触发<div>标记的mouseout事件并分别关闭它.
如何防止在IE中关闭弹出窗口?
来自MSDN:
参数sourceArray
包含要复制的数据的Array.destinationArray
接收数据的Array.长度
一个64位整数,表示要复制的元素数.整数必须介于0和Int32.MaxValue之间(包括0和Int32.MaxValue)
鉴于值的允许范围是0对Int32.MaxValue,什么是添加此签名的动机是什么?它在.Net 1.0中不存在,只在.Net 1.1中添加.我唯一的猜测是准备64位框架实现.
您希望使用通用语言的哪些功能?更准确地说,我的意思是通常根本不存在的功能,但很高兴看到,而不是"我希望动态打字很受欢迎".
假设我有两个看起来像这样的函数:
public static void myFunction1(int a, int b, int c, string d)
{
//dostuff
someoneelsesfunction(c,d);
//dostuff2
}
public static void myFunction2(int a, int b, int c, Stream d)
{
//dostuff
someoneelsesfunction(c,d);
//dostuff2
}
Run Code Online (Sandbox Code Playgroud)
什么是避免重复dostuff的好方法?
我想过的想法,但不喜欢:
我正在维护/开发一个家庭作业测试平台.它主要是自动的.我现在需要添加的是代码分析.我需要检查特定结构的代码.
例如:
该文件是否
main.cpp包含user使用const方法 命名的类get_name()?
是否有一些工具可以让我做这些东西(理想的是可以编写脚本的东西).仅限Linux.
查看http://code.google.com/chrome/extensions/api_index.html,我无法找到任何文档chrome.app.我没有chrome.app.getDetails()上班的麻烦,但我想知道是否有任何形式的官方文件(或者为什么不,如果没有).
假设我有一些看起来像这样的代码:
foreach(type x in list y)
{
//dostuff1(x)
}
foreach(type x in list y)
{
//dostuff2(x)
}
foreach(type x in list y)
{
//dostuff3(x)
}
foreach(type x in list y)
{
//dostuff4(x)
}
foreach(type x in list y)
{
//dostuff5(x)
}
Run Code Online (Sandbox Code Playgroud)
我无法将事物组合成一个像这样的大循环:
foreach (type x in list y)
{
//dostuff1(x)
//dostuff2(x)
//dostuff3(x)
//dostuff4(x)
//dostuff5(x)
}
Run Code Online (Sandbox Code Playgroud)
这样做会改变顺序.有关在C#中使代码更简单的最佳方法的任何评论?
我想我可以通过创建这样的函数来解决这个问题,尽管我宁愿保持它的方式而不是强迫我的代码的未来读者理解yield:
void func(type x)
{
dostuff1(x)
yield 0;
dostuff2(x)
yield 0;
dostuff3(x)
yield 0;
dostuff4(x)
yield 0;
dostuff5(x)
yield break;
}
for …Run Code Online (Sandbox Code Playgroud) c# ×6
.net ×1
arrays ×1
c++ ×1
delegates ×1
javascript ×1
jquery ×1
linux ×1
optimization ×1
refactoring ×1
sql-server ×1