我看到lambda表达式已经成为语言中某些点的非常有用的工具.我一直在使用它们,大部分时间它们非常适合,使代码更短,也许更清晰.
现在..我见过一些,我会说过度使用它们.有些人非常喜欢它们,试图在任何地方使用它们.有时候C#代码看起来像一种函数式语言.
其他因素是使用lambda反射的成本以及对调试不友好的成本.
我想听听有关使用或多或少的lambda表达式有多好以及如何清除代码的意见.
(这不是更好的例子,但让我们说它是触发器)
我正在编写以下代码.使用它delegate { return null; }可以帮助我避免在每次必须使用它时询问事件是否为空.
public delegate ContactCellInfo.Guest AddGuest();
public event AddGuest GuestRequest = delegate { return null;}
Run Code Online (Sandbox Code Playgroud)
我使用resharper和明智的resharper(甚至有时候文字吃掉记忆)让我提出以下建议
public delegate ContactCellInfo.Guest AddGuest();
public event AddGuest GuestRequest = () => null;
Run Code Online (Sandbox Code Playgroud)
在我看来,使用委托的代码看起来更清晰.我并不反对Lamdba的表达,只是想听听关于如何以及何时使用它们的一些建议.
我正在尝试将字符代码转换为带有chr()的字符,但VBScript并没有给我我期望的值.根据VBScript,字符代码199是:
�
Run Code Online (Sandbox Code Playgroud)
但是,当使用Javascript的String.fromCharCode之类的东西时,199是:
Ç
Run Code Online (Sandbox Code Playgroud)
第二个结果是我需要摆脱VBScript的chr()函数.知道问题是什么吗?
如何初始化包含类型可能不同的通用对象的列表?
例如,我有以下内容:
this.Wheres = new List<Where<>>();
Run Code Online (Sandbox Code Playgroud)
如您所知,<>是无效的语法.但是,有时传递给Where的类型将是一个字符串,有时它将是DateTime等.我尝试使用object作为初始化类型,但这也不起作用.
我已经看到一些利用新任务栏功能在网络上弹出的Windows 7应用程序.但是,其中一些应用程序正在处理任务栏,如通知区域.没有前景窗口.所有交互都通过任务栏按钮完成(包括叠加,进度条,跳转列表等).
就个人而言,我更喜欢新的任务栏而不是通知区域,因为我能够使用更大的图标并为用户提供非常熟悉的用户界面和丰富的体验.但我也觉得像上面描述的那些应用程序应该保存在通知区域中.
您如何看待使用Windows 7任务栏作为"新通知区域"的应用程序?应该避免吗?
我是P/如图所示调用Graphviz .当我写这篇博客文章时,代码运行得很好.现在,我把在一起的HttpModule呈现使用代码Graphviz的图形,但我得到了AccessViolationException在agmemread.
// Native signature
Agraph_t agmemread(char *);
// P/Invoke Signature
[DllImport(LIB_GRAPH)]
private static extern IntPtr agmemread(string data);
// Usage
IntPtr g = agmemread(data);
Run Code Online (Sandbox Code Playgroud)
就像我说的,这之前完美无缺.但现在,我无法让我的代码适用于任何事情.即使我基于相同代码的旧Graphviz应用程序也不再起作用.
我可能有什么改变会导致这种情况?我甚至没有下载新版本的Graphviz或任何东西,所以DLL都是一样的.
编辑:我尝试string改为StringBuilder,但产生了相同的结果.然后,我添加了一个MarshalAs属性:
static extern IntPtr agmemread([MarshalAs(UnmanagedType.LPWStr)] string data);
Run Code Online (Sandbox Code Playgroud)
有了它,我不再得到一个AccessViolationException,但Graphviz无法正确读取字符串并返回空指针.
我有一个名为DatabaseHelper的类,它包装了一个DbConnection.为using语句设置此类的正确方法是什么?我已经实现了IDisposible,但我不确定我应该何时何地调用Connection.Close()或Connection.Dispose().
当我在我自己的Dispose()方法中调用Connection.Dispose()时,我有时会从我的DbConnection对象中获取SocketException.我认为这是因为旧的连接处于打开状态,但没有附加到异常的详细信息,所以我无法确定.
我在模板引擎中使用两种方法作为自定义标记:
# Renders a <select> form field
def select_field(options, selected_item, field_name):
options = [(str(v),str(v)) for v in options]
html = ['<select name="%s">' % field_name]
for k,v in options:
tmp = '<option '
if k == selected_item:
tmp += 'selected '
tmp += 'value="%s">%s</option>' % (k,v)
html.append(tmp)
html.append('</select>')
return '\n'.join(html)
# Renders a collection of <select> fields for datetime values
def datetime_field(current_dt, field_name):
if current_dt == None:
current_dt = datetime.datetime.now()
day = select_field(range(1, 32), current_dt.day, field_name + "_day")
month = select_field(range(1, …Run Code Online (Sandbox Code Playgroud) private List<string> _Baseline = new List<string>();
public List<string> Baseline
{
get { return _Baseline; }
set { _Baseline = value; }
}
Run Code Online (Sandbox Code Playgroud)
我该如何设置此属性?它不允许我使用add方法添加; 它会抛出"对象引用null"错误.
我所连接的旧数据库使用数据缓冲区将行传递给应用程序。为了在 C# 中处理这个问题,我编写了一个类,它提供了在缓冲区中读取和写入不同类型的方法。每个数据文件使用一个数据缓冲区,但必须为某些操作调整缓冲区的大小。为此,我添加了一个Allocate方法:
public void Allocate(int bytes) {
if (handle != IntPtr.Zero) { // memory has already been allocated
Marshal.FreeHGlobal(handle);
}
handle = Marshal.AllocHGlobal(bytes);
}
Run Code Online (Sandbox Code Playgroud)
然而,那是在我注意到ReAllocHGlobal之前。现在我想知道我是否应该这样做:
public void Allocate(int bytes) {
if (handle != IntPtr.Zero) { // memory has already been allocated
handle = Marshal.ReAllocHGlobal(handle, (IntPtr)bytes);
} else { // this is a brand new data buffer
handle = Marshal.AllocHGlobal(bytes);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为第一种方法看起来更干净,但哪种方法最好用?我的第一个想法是ReAllocHGlobal最有意义(因为它专门用于调整现有内存块的大小),但我不能 100% 确定。
我的项目中有一个App.config文件,它在构建时被复制到NameOfExe.exe.config.我的软件用户有时需要编辑这个文件,但是他们可能不熟悉.NET的工作方式(或者计算机如何做一般事情).我认为使用这样的文件名可能会混淆它们,扩展名为.exe.config等.
如何为此复制文件指定新名称(删除.exe位)?我应该使用自定义构建命令吗?另外,.NET会接受配置文件,还是需要命名方案?
编辑:响应重新考虑的建议...应用程序充当服务或控制台应用程序,因此没有GUI来编辑设置.配置文件包含用于连接数据库和API服务的设置.在每个客户的初始设置(由我完成)之后,不需要更改这些值.如果值确实需要更改,客户将需要打电话给我以获取新的连接详细信息,因此我可以指导他们完成编辑和操作的内容.当我告诉客户他们需要打开一个名为".exe.config"的文件时,我只想避免任何混淆,此时他们错误地启动了".exe"文件.此外,如果他们需要启动.exe文件并启用"隐藏已知文件类型的扩展名",有些人可能会尝试打开配置文件,然后打电话给我,想知道他们为什么会得到一个充满奇怪文本的记事本窗口.
当然,这不是必需的,但我喜欢提前计划.
c# ×6
.net ×3
app-config ×1
chr ×1
collections ×1
datetime ×1
dbconnection ×1
delegates ×1
dispose ×1
fromcharcode ×1
generics ×1
graphviz ×1
interop ×1
javascript ×1
lambda ×1
list ×1
pinvoke ×1
python ×1
rename ×1
taskbar ×1
types ×1
vb.net ×1
vbscript ×1
windows-7 ×1