Tag: 语法

c#中的`new object()`和`new {}`之间有什么区别吗?

在c#中, var x = new {}; 声明没有属性的匿名类型。 这有什么不同吗? var x = new object(); ?

如何在C#中为委托类型的参数提供默认值?

在C#中,我们可以提供参数的默认值: void Foo(int i =0) {} 但是,当方法签名是: void FooWithDelegateParam(Func predicate) {} 我们如何传递默认参数: void FooWithDelegateParam(Func predicate = (string,string x)=> {return y;}) {} 但这不会编译。 那么,这样做的正确语法是什么? 注意:我正在尝试提供一种通过委托为输出字符串映射器指定输入字符串的方法,如果没有提供,我只想返回输入字符串。 因此,对于实现这一目标的任何替代方法的建议也受到高度赞赏。 谢谢。

如何将参数传递给DbMigration.Sql()方法

使用entity framework迁移时, DbMigration基类具有一个Sql方法,该方法接受匿名对象中的参数 我不能为我的生活弄清楚如何使用它。 Sql(@” UPDATE dbo.SlideSets SET Name = @Name, “, false, new { Name = “Foo” } ); 导致错误 System.Data.SqlClient.SqlException (0x80131904): Must declare the scalar variable “@Name” 这句话的正确语法是什么?

C#exceptioninheritance语法w /generics

我在NHibernate类定义中遇到了这个问题: public class SQLiteConfiguration : PersistenceConfiguration 所以这个类inheritance自一个由派生类参数化的基类? 我的脑袋爆炸了。 有人可以解释这意味着什么以及这种模式有用吗? (顺便说一句,这不是一个特定于NHibernate的问题。)

将null转换为对象?

我今天遇到了这个代码 AsyncInvoke(OnTimeMessageTimer, (object)null, (ElapsedEventArgs)null); 这有什么不对吗?

访问静态代码块中的“this”

最近我发现自己写了很多类似于: public class MyTypeCodes { public static MyTypeCode E = new MyTypeCode{ Desc= “EEE”, Value = “E” }; public static MyTypeCode I = new MyTypeCode { Desc= “III”, Value = “I” }; private static readonly Lazy<IEnumerable> AllMyTypeCodes = new Lazy<IEnumerable>(() => { var typeCodes = typeof(MyTypeCodes) .GetFields(BindingFlags.Static | BindingFlags.Public) .Where(x => x.FieldType == typeof (MyTypeCode)) […]

什么是在.NET中构建解析器的goto方法

语法也是如此。 如果一个人从头开始接近一个通用的解析器怎么会去做呢? 我看过ANTLR和Irony,但它们比方法论更多。 应该解决的步骤是什么?成就的里程碑是什么?

我何时应该使用“var”而不是“object”?

我想知道你什么时候应该使用var ? C#中的几乎任何东西,除了可能是原语和一些更奇怪的情况,都来自Object。 那么使用那些实际类型不是更好的做法吗? 或者至少是object ? (我已经编程了一段时间,我的严格观点是var是邪恶的)

如何将当前执行状态推送到堆栈中以便以后可以继续执行?

想象一个简单的语法: (a|ab)c 其中读取(a或ab)后跟c。 解析树看起来像这样: and / \ or c / \ a ab 现在给它这个输入: abc 我们首先遍历树的左侧,然后匹配“a”,然后返回一个级别。 由于“a”匹配,“或”也是如此,因此转到“c”。 “c”不匹配,我们走到了尽头。 但它可以采取另一条路径; 如果我们走到“ab”,我们就会找到一场比赛。 所以我想要为“或”节点做的基本上是这样的: 评估左分支 如果左分支不匹配,请尝试右分支 如果左匹配匹配,则将当前状态推送到堆栈,以便我们可以在以后必要时继续 然后每当解析器遇到死胡同时,我想从堆栈中弹出一个项目并再次从那里继续。 这是我无法弄清楚的部分……我如何基本上保存当前的调用堆栈? 我可以将“ab”节点保存在堆栈中,这样我就知道我必须接下来执行那个节点,但是之后它仍然需要知道它需要后退到“或”。 我认为克里斯有所作为。 我们必须找到一种翻译树的方法,这样就不必像这样跳过树枝。 例如,这个等效的解析树没有这个问题: or / \ and and / \ / \ ac ab c 这次我们解析左边,点击“a”,它通过,所以我们尝试旁边的“c”节点,失败,“和”失败,“或”必须尝试正确的分支,……“ab “通过,另一个”c“通过,然后整个表达通过。

隐含上下文相关运算符的想法。 (点)作为语法糖

与其他语言相比,C#中的某些操作似乎不必要地笨重。 例如lambdas: students.GroupBy(student => student.State).Where(student => student.Count > 1).OrderByReversed(studentGroup => studentGroup.Count); 这可以通过使用非常短的变量名来缩短: students.GroupBy(s => s.State).Where(s => s.Count > 1).OrderByReversed(sg => sg.Count); 但是这样变量在上下文之外很难理解。 进一步缩短它的一种方法是简单地完全跳过单参数列表,并让点隐含参数: students.GroupBy(.State).Where(.Count > 1).OrderByReversed(.Count); 对我来说,这比上述任何一个都更具可读性。 它仅适用于单参数lambdas,当然它的含义是从上下文推断出来的。 编辑:对于lambdas,参数本身直接使用’。’ 可以用作直接占位符: var lines = text.Split(“\n”).Where(line => line != “”); 可以缩短一点使用: var lines = text.Split(“\n”).Where(. != “”); 可以使用这种下级运算符的另一个地方是Enum传递。 当从上下文中显而易见时,枚举的名称通常会传递得太多。 例如,使用OpenTK(OpenGL的C#实现),创建一个简单的纹理需要每次调用这样的东西: GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bd.Width, bd.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgr, […]