Questions tagged «c#»

C#是Microsoft与.NET平台并行创建的一种多范式,托管的,垃圾回收的面向对象编程语言。

6
C#的Pascal套管方法名称背后的原理/原因是什么?
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 8年前。 我刚刚开始学习C#。来自Java,C ++和Objective-C的背景知识,我发现C#的Pascal框其方法名称相当独特,并且一开始很难适应。这背后的原因和哲学是什么? 我猜这是因为C#属性。与Objective-C中的方法名可以与实例变量完全相同的情况不同,C#并非如此。我猜想属性(与支持它的大多数语言一样)的目标之一是使属性与变量和方法真正区分开。因此,在C#中可以有一个“ int x”,并且相应的属性变为X。为了确保属性和方法是不可区分的,因此,我猜测的所有方法名称也应以大写字母开头。(这只是基于目前为止我对C#的了解而得出的假设,我仍在学习中)。我很好奇这个好奇的指南是如何产生的(鉴于它是 (编辑:通过Pascal-casing,我的意思是PascalCase(基本上是camelCase,但以大写字母开头)。在大多数语言中,方法名称通常以小写字母开头)

3
C#8非空引用和Try模式
在C#类中有一个模式,以Dictionary.TryGetValue和表示int.TryParse:一种方法,该方法返回指示操作成功的布尔值和包含实际结果的out参数;如果操作失败,则将out参数设置为null。 假设我正在使用C#8不可为空的引用,并且想为自己的类编写一个TryParse方法。在正确的签名是这样的: public static bool TryParse(string s, out MyClass? result); 因为在错误情况下结果为null,所以必须将out变量标记为可为空。 但是,通常使用Try模式,如下所示: if (MyClass.TryParse(s, out var result)) { // use result here } 因为我仅在操作成功时才​​进入分支,所以结果在该分支中永远不能为null。但是因为我将其标记为可为空,所以现在我必须检查它或使用它!来覆盖: if (MyClass.TryParse(s, out var result)) { Console.WriteLine("Look: {0}", result.SomeProperty); // compiler warning, could be null Console.WriteLine("Look: {0}", result!.SomeProperty); // need override } 这很丑陋,有点不符合人体工程学。 由于典型的使用模式,我还有另一种选择:关于结果类型: public static …
22 c#  .net  null 

4
多对多(连接)表中是否需要唯一ID列?
从EF开始一些项目,但是我对联接表和键等有一些疑问。可以说我有一个应用程序表和一个权限表。应用程序具有许多权限,每个许可权可以属于多个应用程序(多对多)。 现在,“应用程序”和“权限”表很简单: Applications -------------- PK ApplicationID Name Permissions -------------- PK PermissionID Name 但是做联接表的最佳方法是什么?我有两个选择: ApplicationPermissions ----------------------- PK ApplicationPermissionID CU ApplicationID CU PermissionID 要么 ApplicationPermissions ----------------------- CPK ApplicationID CPK PermissionID PK = Primary Key CPK = Composite Primary Key CU = Composite Unique Index 您曾经被一种方法折磨过吗?严格优先吗?我发现很多“差异”都会被我的存储库模式抽象化(例如,我几乎永远不会创建一个完整的权限对象并将其添加到应用程序中,而是通过ID或唯一名称或东西),但我想我正在寻找恐怖故事,一种或另一种方式。

7
在生产中记录用户操作的最佳做​​法
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 7年前。 我打算在生产环境中记录很多不同的东西,例如当用户: 登录,注销 变更个人资料 编辑帐户设置 更改密码...等 在生产环境中这样做是一种好习惯吗?还有什么是记录所有这些的好方法。我目前正在使用以下代码块登录: public void LogMessageToFile(string msg) { System.IO.StreamWriter sw = System.IO.File.AppendText( GetTempPath() + @"MyLogFile.txt"); try { string logLine = System.String.Format( "{0:G}: {1}.", System.DateTime.Now, msg); sw.WriteLine(logLine); } finally { sw.Close(); } } 这样可以生产吗?我的应用程序是一个非常新的应用程序,因此我不希望马上有数百万用户,或者寻找最佳实践来跟踪网站上的操作,甚至是最佳实践。
22 c#  asp.net  logging 

3
什么时候应该将类或模块放在单独的Assembly / DLL中?
是否有任何准则来决定何时将一个类放在其自己的程序集中/ DLL中?我经常看到两种思想流派: 1)每个类的“分组”都属于其自己的DLL,例如存储库,服务,DTO,基础结构等。 2)一切都应在单个DLL中,但应通过名称空间/文件夹分开,例如,具有“ Core” DLL以及其他名称空间,例如Core.Repositories,Core.Services,Core.DTO等。 在工作中,我们将所有组件都集中在一个称为“业务”的程序集中。有一些文件夹,但没有真正的分离-业务对象(带有逻辑,其中一些甚至不应该是类)被放在“ BusinessObjects”文件夹中而不用管。多个类中使用的内容位于“ Core”文件夹中。实用程序位于“实用程序”文件夹中,数据访问基础结构位于“数据”文件夹中-您就明白了。 对于我正在使用的新模块,我希望/需要一个单独的数据访问层(认为是基本的存储库实现),但我不想将其与其他160个一起放到“ BusinessObjects”文件夹下!在那里上课。同时,我担心创建一个新的类库,因为每个人都习惯于将一个类填充到单个库中。文件夹/命名空间可以工作。

3
在C#中这种明显的自引用的目的是什么?
我正在评估一个名为Piranha(http://piranhacms.org/)的开源CMS ,以便在我的一个项目中使用。至少对于我来说,我发现以下代码有趣且有点混乱。可以帮助我理解为什么类从相同类型的基类继承吗? public abstract class BasePage<T> : Page<T> where T : BasePage<T> { /// <summary> /// Gets/sets the page heading. /// </summary> [Region(SortOrder = 0)] public Regions.PageHeading Heading { get; set; } } 如果BasePage<T>要定义的类,为什么要继承Page<T> where T: BasePage<T>?它有什么具体目的?
21 c#  architecture  .net  cms 

4
用C#7编写“ Try”方法的最优雅方法是什么?
我正在编写一种类型为Queue的实现,该实现的TryDequeue方法使用与各种.NET TryParse方法类似的模式,如果操作成功,我将在其中返回一个布尔值,并使用一个out参数来返回实际出列的值。 public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message); 现在,我想尽可能避免使用outparams。C#7为我们提供了变量代用,以使使用它们变得更容易,但是我仍然认为,参数比起有用的工具更多的是必要的弊端。 我想要此方法的行为如下: 如果有要出队的物品,请将其退回。 如果没有要出队的项目(队列为空),请向调用者提供足够的信息以使其正确执行操作。 如果没有剩余的项目,不要只是返回一个空项目。 如果尝试从空队列中出队,请不要抛出异常。 现在,此方法的调用者几乎总是使用如下模式(使用C#7 out变量语法): if (myMessageQueue.TryDequeue(out Message dequeued)) MyMessagingClass.SendMessage(dequeued) else Console.WriteLine("No messages!"); // do other stuff 总而言之,这还不是最糟糕的。但是我不禁感到可能有更好的方法可以做到这一点(我完全愿意承认可能没有)。我讨厌调用者如何只需要在有条件的情况下获得一个值就可以有条件地打破它的流程。 还有哪些其他模式可以完成相同的“尝试”行为? 就上下文而言,此方法可能会在VB项目中调用,因此在这两种方法中都可以很好地使用的方法可获得加分。不过,这个事实应该没有太大的意义。
21 c# 

4
使用C#中的抽象类作为定义
作为一名C ++开发人员,我已经习惯了C ++头文件,并发现在代码中包含某种强制性的“文档”很有用。通常,在这种情况下,我不得不读一些C#代码时会很糟糕:我没有正在使用的类的思维导图。 假设作为软件工程师,我正在设计程序的框架。将每个类都定义为抽象的未实现类是否太疯狂了,就像我们对C ++标头所做的那样,让开发人员实现它呢? 我猜可能有人可能会因为某些原因而认为这是一个糟糕的解决方案,但我不确定为什么。这样的解决方案必须考虑什么?

1
Go如何通过“隐式”界面提高生产率,与C#的扩展方法概念相比又如何?
在Go语言教程中,他们解释了界面如何工作: Go没有课程。但是,您可以在结构类型上定义方法。该方法接收器出现在FUNC关键字和方法名之间自身的参数列表。 type Vertex struct { X, Y float64 } func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } 接口类型由一组方法定义。接口类型的值可以包含实现那些方法的任何值。 这是在Go中创建界面的唯一方法。Google进一步说明: 类型通过实现方法来实现接口。没有明确的意图interface声明(即声明)。 隐式接口将实现程序包与定义接口的程序包分离:两者都不依赖彼此。 它还鼓励定义精确的接口,因为您不必查找每个实现并使用新的接口名称对其进行标记。 所有这些听起来都像C#中的扩展方法,但是Go中的方法是残酷的多态的。它们将在实现它们的任何类型上运行。 Google声称这鼓励快速发展,但是为什么呢?您是否放弃了C#中的显式接口而放弃了某些东西?C#中的扩展方法能否允许人们从Go接口中获得C#的某些好处?
21 c#  language-design  go 

3
由于需要过多的模拟而导致单元测试脆弱
关于我们在团队中实施的单元测试,我一直在遇到越来越烦人的问题。我们正在尝试将单元测试添加到设计不良的旧代码中,尽管我们在实际添加测试方面没有遇到任何困难,但是我们开始为测试的结果而苦恼。 作为问题的一个示例,假设您有一个方法在执行过程中调用了5个其他方法。此方法的测试可能是确认是否由于调用这5个其他方法之一而导致了行为。因此,由于单元测试应该仅出于一个原因和一个原因而失败,因此您希望消除调用这四种方法并对其进行模拟而导致的潜在问题。大!执行单元测试,忽略模拟的方法(它们的行为可以作为其他单元测试的一部分进行确认),并且验证有效。 但是存在一个新问题-单元测试对您如何确认将来行为和任何其他4种方法的签名变化或需要添加到“父方法”的任何新方法有深入了解。导致必须更改单元测试以避免可能的故障。 自然地,可以通过简单地使更多的方法完成更少的行为而在某种程度上缓解该问题,但是我希望可以找到一个更优雅的解决方案。 这是捕获问题的示例单元测试。 简要说明一下,“ MergeTests”是一个单元测试类,它继承自我们正在测试的类,并根据需要覆盖行为。这是我们在测试中采用的“模式”,允许我们覆盖对外部类/依赖项的调用。 [TestMethod] public void VerifyMergeStopsSpinner() { var mockViewModel = new Mock<MergeTests> { CallBase = true }; var mockMergeInfo = new MergeInfo(Mock.Of<IClaim>(), Mock.Of<IClaim>(), It.IsAny<bool>()); mockViewModel.Setup(m => m.ClaimView).Returns(Mock.Of<IClaimView>); mockViewModel.Setup( m => m.TryMergeClaims(It.IsAny<Func<bool>>(), It.IsAny<IClaim>(), It.IsAny<IClaim>(), It.IsAny<bool>(), It.IsAny<bool>())); mockViewModel.Setup(m => m.GetSourceClaimAndTargetClaimByMergeState(It.IsAny<MergeState>())).Returns(mockMergeInfo); mockViewModel.Setup(m => m.SwitchToOverviewTab()); mockViewModel.Setup(m => m.IncrementSaveRequiredNotification()); mockViewModel.Setup(m …

5
C#中“ new”修饰符在隐藏方面有哪些实际用途?
我和一位同事正在研究newC#中关键字的行为,因为它适用于隐藏的概念。从文档中: 使用new修饰符可显式隐藏从基类继承的成员。若要隐藏继承的成员,请在派生类中使用相同的名称对其进行声明,然后使用new修饰符对其进行修改。 我们已经阅读了文档,并且了解了它的基本功能以及工作方式。我们真正无法解决的是为什么您首先需要这样做。自2003年以来,该修饰符就已经存在了,而我们俩一直都在使用.Net进行更长时间的工作,而且从未出现过。 在实际意义上何时需要采取这种行为(例如:应用于业务案例)?这是功能已经过时了吗?或者它在我们所做的事情中(只是我们在处理Web窗体和MVC应用程序以及一些小因素WinForms和WPF)干脆不常见?在尝试并使用该关键字时,我们发现了一些行为,如果使用不当,可能会带来一些危险。 这听起来有些开放,但是我们正在寻找一种特定的用例,该用例可以应用于发现该特定工具有用的业务应用程序。
21 c#  keywords 

5
如何在ASP.NET应用程序背后的客户端Javascript和C#代码之间传递数据?
我正在寻找在ASP.NET应用程序背后的客户端JavaScript代码和C#代码之间传递数据的最有效/标准方式。我一直在使用以下方法来实现此目的,但是它们都感觉有些偏软。 要将数据从JavaScript传递到C#代码,是通过设置隐藏的ASP变量并触发回发: <asp:HiddenField ID="RandomList" runat="server" /> function SetDataField(data) { document.getElementById('<%=RandomList.ClientID%>').value = data; } 然后在C#代码中收集列表: protected void GetData(object sender, EventArgs e) { var _list = RandomList.value; } 回到另一种方式,我经常使用ScriptManager来注册一个函数并在Page_Load期间将其传递数据: ScriptManager.RegisterStartupScript(this.GetType(), "Set","get("Test();",true); 或在回发之前,初始化或预渲染阶段添加属性到控件: Btn.Attributes.Add("onclick", "DisplayMessage("Hello");"); 这些方法很好地为我服务并完成了工作,但感觉并不完整。在客户端JavaScript和C#后端代码之间传递数据的方法是否更标准? 我见过像一些帖子这样一个描述的HtmlElement类; 这是我应该研究的东西吗?

5
使用静态类作为名称空间
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 8年前。 我看到其他开发人员使用静态类作为名称空间 public static class CategoryA { public class Item1 { public void DoSomething() { } } public class Item2 { public void DoSomething() { } } } public static class CategoryB { public class Item3 { public void DoSomething() { } } …

7
可怕的C#编程面试-有什么建议吗?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 4年前关闭。 我有一份可能的C#开发人员职位,但在进行面试之前,我需要通过职业介绍所的测试。 现在,即使我是一位资深开发人员,拥有超过10年的编程经验,并且其中有超过3年的c#经验,我真的不希望进行此测试,而且我认为我很有可能会失败。 以我的经验,这些测试是无法预测的,要求您在日常工作中很少使用的东西。 对于需要修改的内容,我需要您的最佳建议-例如一本好书或网站。我的准备时间不到1周,因此必须通过。 提前致谢。 编辑:为进一步证明我对编写此类测试的关注,请考虑以下问题: 12)一个事件是: a) The result of a users action - correct answer b) The esult of a party c) code to force users action 根据测试,正确的答案是A,但是由于我一直在进行SOA开发(通常情况下事件可以基于系统事件(而不是用户操作),所以我100%确信事件不必由用户操作。这也是一个C#问题(不是ASP.net问题)。根据我的理解,我无法真正找到正确的答案,但B似乎是最好的(如果party的定义是:any可以触发事件的实体,这类问题使我感到恐惧。
21 c#  interview 

9
是否将业务逻辑放入存储过程中?
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 8年前。 关于“-是否将业务逻辑放入存储过程?”这一主题一直存在争议。如果我们决定不使用ORM工具并且不将业务逻辑放入存储过程中,那么我们将业务逻辑放在哪里? 在以前的应用程序中,我始终倾向于仅将所有业务逻辑放入存储过程中。然后从.NET代码中,我使用数据访问应用程序块调用这些存储过程。SQLHelper等。但这并非一直都是这种情况。所以我做了一些谷歌搜索,但最终陷入了混乱。 有什么建议...吗?
21 c#  .net  sql 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.