小编RLH*_*RLH的帖子

为什么C#lambda表达式不能由一个简单的if语句组成,而不需要大括号?

请考虑以下分配给事件的lambda表达式.

foo.BarEvent += (s, e) => if (e.Value == true) DoSomething();
Run Code Online (Sandbox Code Playgroud)

这看起来很简单,只包含一行代码.那么为什么我从调试器中得到以下2个错误?

无效的表达式术语'if'


只有赋值,调用,递增,递减,等待和新对象表达式才能用作语句

要解决此问题,您所要做的就是用if括号括起您的语句.

foo.BarEvent += (s, e) => { if (e.Value == true) DoSomething(); };
//Errors now disappear!
Run Code Online (Sandbox Code Playgroud)

我理解这些错误消息的含义.我不明白的是为什么单条件if语句会成为编译器的问题,以及为什么第一个lambda赋值被认为是破坏的.

有人可以解释一下这个问题吗?

c# lambda

22
推荐指数
2
解决办法
8218
查看次数

为什么<body>元素上有默认的边距?

在我的大部分开发生涯中,我只需要涉足基于Web的前端UI开发.有一件事总是让我感到困惑的是不断需要重置基于浏览器的样式"假设",我经常忘记这些,直到这些默认值开始影响我的页面布局.

大多数浏览器最大的假设是HTML <body>元素应该有一个边距,几乎总是8px.

这个默认保证金的设计决定是什么?

事实上,这种边际是非常不可取的,基本上标准的做法是将这种类型的样式包含在.css文件中,该文件包含在网站的每个页面中:

html, body
{
    margin: 0px; padding: 0px
}
Run Code Online (Sandbox Code Playgroud)

恕我直言,逻辑将要求大多数开发人员想要一个完整的,空白的平板,他们可以自己决定使用和格式化.随着浏览器的默认身体周围元素的余量,设计师必须保持有争议的间距,并添加代码来计算正确的布局,其内部元素,如果他们不重新布局.

HTML浏览器的原始开发人员是否有任何理由在默认情况下决定在所有正文元素上抛出此边距?

html css

22
推荐指数
1
解决办法
6446
查看次数

C函数可以有多个签名吗?

可能重复:
C中的函数重载

抱歉,如果这是一个复制,但如果是,我找不到它.

在C中,您可以定义具有相同功能名称但具有不同参数的多个功能吗?我来自C#背景.在C#中,以下代码完全合法.

//我们的第一个功能

int MyFunction()
{
    //Code here
    return i;
}

int MyFunction(int passAParameter)
{
    // Code using passAParameter
    return i;
}
Run Code Online (Sandbox Code Playgroud)

在我的特定情况下,我想在参数列表的末尾创建一个具有一个可选参数(即int)的函数.可以这样做吗?

c function

20
推荐指数
2
解决办法
3万
查看次数

编译器值类型分辨率和硬编码"0"整数值

首先,有点背景.阅读此处发布的问题和已接受的答案,以了解我的问题的具体方案.我不确定是否存在其他相似的案例,但这是我所知道的唯一案例.

上面的"怪癖"是我早已意识到的.直到最近,我才明白原因的全面性.

微软关于这个SqlParameter课程的文档对这种情况有了更多的了解.

Object在value参数中指定a 时,SqlDbType将从Object的Microsoft .NET Framework类型推断出.

使用SqlParameter构造函数的此重载指定整数参数值时请小心.因为此重载采用type的值Object,所以必须在值为零时将整数值转换为Object 类型,如下面的C#示例所示.

Parameter = new SqlParameter("@pname", Convert.ToInt32(0));

如果不执行此转换,编译器会假定您尝试调用SqlParameter(string,SqlDbType)构造函数重载.

(emph.补充)

我的问题是为什么编译器假设当你指定硬编码"0"(并且只有值"0")时,你试图指定枚举类型而不是整数类型?在这种情况下,它假定您声明SqlDbType值,而不是值0.

这是非直观的,更糟糕​​的是,错误是不一致的.我有一些旧的应用程序,我已经编写了多年来调用存储过程.我将对应用程序进行更改(通常甚至与我的SQL Server类无关),发布更新,这个问题会突然中断应用程序.

当包含多个方法签名的对象包含两个相似的签名时,为什么编译器会被值0混淆,其中一个参数是对象/整数而另一个接受枚举?

正如我所提到的,我从未将其视为任何其他类的任何其他构造函数或方法的问题.这是SqlParameter该类的独特之处还是这是一个在C#/ .Net中继承的bug?

.net c# compiler-construction

18
推荐指数
2
解决办法
1197
查看次数

如何改进这些案例转换功能?

作为一个学习锻炼,我的三个功能,ToggleCase,小写和大写,每想到一个指针的ASCII字符的字符串,由空字符终止; 他们按预期工作.有更高效或更快的方法来完成这项任务吗?我是否违反任何优秀C编码的潜规则?我已经使用了宏,因为我认为它使代码看起来更好,而且比函数调用更有效.这是典型的还是矫枉过正的?

请随意挑选和批评代码(但确实很好).

case_conversion.h

#define CASE_FLAG 32
#define a_z(c) (c >= 'a' && c <= 'z')
#define A_Z(c) (c >= 'A' && c <= 'Z')

void ToggleCase(char* c);
void LowerCase(char* c);
void UpperCase(char* c);
Run Code Online (Sandbox Code Playgroud)

case_conversion.c

#include "case_conversion.h"

void ToggleCase(char* c)
{
 while (*c)
 {
  *c ^= a_z(*c) || A_Z(*c) ? CASE_FLAG : 0;
  c++;
 }
}
void LowerCase(char* c)
{
 while (*c)
 {
  *c ^= A_Z(*c) ? CASE_FLAG : 0;
  c++;
 }
}
void UpperCase(char* c)
{
 while (*c)
 { …
Run Code Online (Sandbox Code Playgroud)

c string optimization case-sensitive

16
推荐指数
3
解决办法
1399
查看次数

iPhone上的USB编程

我想做的就是通过USB端口发送/接收数据.除了MFi之外,使用官方SDK是不可能的.

哪些其他方法可以与其他设备进行通信,您会建议吗?

提前谢谢了!

GD

iphone usb mfi

16
推荐指数
2
解决办法
2万
查看次数

在VS Designer中加载包时禁用SSIS包验证

我有一些SSIS包部署到SQL 2005 Server,随后在Visual Studio 2003中进行设计和维护.当我打开任何BIDS项目,然后是其中一个包时,设计器总是验证每个数据流和任务宾语.

通常,这不是问题.但是,在某些情况下,我们用于连接和导出AS400数据的系统帐户将无法正确验证.由于我正在导出TON表,每个数据流对象都尝试通过ODBC连接连接到AS400,它会出现"无效帐户"错误,然后继续尝试验证下一个任务.这会锁定系统帐户,因为无效凭据会被尝试40次以上.

在我尝试运行包之前,有什么办法可以禁用验证吗?作为替代方案,是否有一个我可以切换的设置,一旦找到一个无效对象,将停止所有验证?在锁定帐户之前,AS400系统将允许一些错误的尝试.显然,如果我能在此之前切断验证过程,那将是最佳的.

我有什么选择?

sql-server ssis sql-server-2005 bids visual-studio

16
推荐指数
1
解决办法
4万
查看次数

如何在没有第三方软件的情况下生成独特的非顺序串行密钥?

我正在开发一个涉及为硬件实现编写低级C软件的项目.我们希望为我们的设备实现一项新功能,我们的用户可以在购买相关许可证密钥时解锁.

期望的实现步骤很简单.用户给我们打电话,他们请求该功能并向我们发送付款.接下来,我们通过电子邮件向他们发送产品密钥,然后将其输入到硬件中以解锁该功能

我们的硬件未连接到互联网.因此,必须以这样的方式实现算法,即可以从服务器和设备内生成这些密钥.密钥的种子可以从硬件序列号派生,该序列号在两个位置都可用.

我需要一个简单的算法,它可以获取序列号并生成16-20个字母数字字符的唯一,非连续键.

UPDATE

SHA-1看起来是最好的方式.但是,我从SHA-1键的示例输出中看到的是它们很长(40个字符).如果我使用40个字符键,然后截断除了最后16个字符以外的所有字符,我会获得足够的结果吗?

c security algorithm copy-protection

15
推荐指数
1
解决办法
2523
查看次数

在Windows中,当我在Windows资源管理器中双击文件时会发生什么?

TL; DR

当用户双击或选择文件并Enter从Windows资源管理器中按下键时,正在执行的确切的低级内核和OS调用是什么?


细节

这似乎是一个相当奇怪的问题,但我很好奇从Windows资源管理器打开文件的非常"细节"细节.

具体来说,我想知道的是当用户双击或选择文件并Enter在Windows资源管理器中按下键时正在执行的确切的低级内核和OS调用.

我问的原因是因为我有一个应用程序允许用户根据存储在数据库中的元数据浏览和搜索文件.当用户单击Open我提供的按钮时,我启动一个进程,其中根文件是已选择文件的路径.此外,值得一提的是这些文件位于网络共享上.

这已经工作了多年,但是,最近我的公司已经迁移到一个新的Active Directory服务器,现在应用程序被破坏了一小部分用户(1-2%).真奇怪的是这些用户无法打开来自我的应用程序的此文件,但他们可以浏览到该位置并从Windows资源管理器中打开它.当我的应用程序尝试打开该文件时,它会得到一个非常通用的异常,指出无法找到该文件.

我已经三次检查了应用程序正在使用的路径(对于多个文件)并且路径不正确.我已经验证我的用户在打开文件之前已经连接到这些网络驱动器.一切都设置正确,应该工作,但我的应用程序(或System.Process)不能"看到"或打开这些文件.

什么是Windows资源管理器应用程序System.Process与在应用程序中使用不同的做法?


对于那些在回答之前必须有代码的人,这里是我用来打开文件的特别简洁的代码.同样,这已经工作了多年,而且据我所知,你是如何让Windows从.Net中打开文件的.

//From within my Button-Click Event...
string file = e.Cell.Value.ToString();
try
{
    Process p = new Process();
    p.StartInfo.FileName = file;
    p.StartInfo.Verb = "Open";
    p.Start();
} 
catch (Exception ex)
{
    MessageBox.Show("A problem has occurred while trying to open the doccument."
    + "Please make sure that the file below exists and that you have permission " 
    + "to view it."
    + …
Run Code Online (Sandbox Code Playgroud)

.net c# windows windows-explorer

14
推荐指数
2
解决办法
3071
查看次数

以"1"结尾的变量在ILSpy中删除了"1".为什么?

为了探索C#编译器如何优化代码,我创建了一个简单的测试应用程序.每次测试更改,我都编译了应用程序,然后在ILSpy中打开了二进制文件.

我只是注意到一些对我来说很奇怪的东西.显然这是有意的,但是,我想不出编译器会这么做的一个很好的理由.

请考虑以下代码:

static void Main(string[] args)
{
    int test_1 = 1;
    int test_2 = 0;
    int test_3 = 0;

    if (test_1 == 1) Console.Write(1);
    else if (test_2 == 1) Console.Write(1);
    else if (test_3 == 1) Console.Write(2);
    else Console.Write("x");
}
Run Code Online (Sandbox Code Playgroud)

无意义的代码,但我写了这篇文章,看看ILSpy如何解释这些if语句.

但是,当我编译/反编译这段代码时,我注意到了让我摸不着头脑的东西.我的第一个变量test_1被优化为test_!有没有一个很好的理由为什么C#编译器会这样做?

对于全面检查,这是Main()我在ILSpy中看到的输出.

private static void Main(string[] args)
{
    int test_ = 1; //Where did the "1" go at the end of the variable name???
    int test_2 = 0;
    int test_3 = …
Run Code Online (Sandbox Code Playgroud)

c# ilspy

14
推荐指数
2
解决办法
445
查看次数