Questions tagged «c#»

C#(发音为“ See Sharp”)是由Microsoft开发的一种高级,静态类型的多范例编程语言。C#代码通常针对Microsoft的.NET系列工具和运行时,其中包括.NET Framework,.NET Core和Xamarin。使用此标记可解决有关用C#或C#正式规范编写的代码的问题。

2
这个C#字典初始化如何正确?
我偶然发现以下内容,并且想知道为什么它没有引发语法错误。 var dict = new Dictionary<string, object> { ["Id"] = Guid.NewGuid(), ["Tribes"] = new List<int> { 4, 5 }, ["MyA"] = new Dictionary<string, object> { ["Name"] = "Solo", ["Points"] = 88 } ["OtherAs"] = new List<Dictionary<string, object>> { new Dictionary<string, object> { ["Points"] = 1999 } } }; 请注意,“ MyA”和“ …

10
面向对象的编程-如何避免在因变量而略有不同的过程中重复
在我目前的工作中,经常发生的事情是有一个通用的过程需要发生,但是该过程的奇数部分需要根据某个变量的值而稍有不同,所以我不是非常确定处理此问题的最优雅方法是什么。 我将使用我们通常使用的示例,该示例的处理方式会根据所处理的国家/地区而略有不同。 所以我有一堂课,我们称之为Processor: public class Processor { public string Process(string country, string text) { text.Capitalise(); text.RemovePunctuation(); text.Replace("é", "e"); var split = text.Split(","); string.Join("|", split); } } 除了某些国家只需要采​​取其中一些行动。例如,只有6个国家需要资本化步骤。要分割的字符可能会因国家/地区而异。'e'仅根据国家/地区,才需要替换重音符号。 显然,您可以通过执行以下操作来解决此问题: public string Process(string country, string text) { if (country == "USA" || country == "GBR") { text.Capitalise(); } if (country == "DEU") …
64 c#  oop 


2
为什么是“使用系统”;不算作坏习惯吗?
我具有C ++背景,并且我完全理解并同意以下问题的答案:为什么“使用命名空间标准”;被认为是不良做法? 因此,令我惊讶的是,现在已经有了C#的经验,我看到了与之完全相反的地方: using Some.Namespace;确实在任何地方都使用过。无论何时开始使用类型,都首先为其名称空间添加using指令(如果尚不存在)。我不记得曾经看到过一个.cs不是以-开头的文件using System; using System.Collections.Generic; using X.Y.Z; etc...。实际上,如果您通过Visual Studio向导添加了新文件,即使您根本不需要它们,它也会在其中自动添加一些using指令。因此,尽管在C ++社区中您基本上被私刑了,但C#甚至鼓励这样做。至少我是这样。 现在,我知道在C#和C ++中使用指令并不完全相同。另外,我确实知道,using namespace在C ++中可以做的最讨厌的事情之一,即将其放入头文件中,由于缺少头文件和的概念,因此在C#中没有同等讨厌的对象#include。 但是,尽管它们有所不同,但在C#和C ++中使用伪指令却达到了相同的目的,即仅需SomeType始终键入,而不必花更长的时间Some.Namespace.SomeType(在C ++中使用::代替.)。出于同样的目的,危险对我来说似乎也一样:命名碰撞。 在最佳情况下,这会导致编译错误,因此您“仅”必须进行修复。在最坏的情况下,它仍然会编译,并且代码会静默地执行与您预期的不同的操作。所以我的问题是:为什么(显然)使用的指令在C#和C ++中被认为是同等糟糕的? 我有一些答案的想法(尽管这些想法都没有真正让我满意): 命名空间趋向于更长和更嵌套在C#比在C ++(std对比System.Collection.Generic)。因此,以这种方式对代码进行降噪会有更多的愿望和收获。但是,即使这是真的,该参数也仅在我们查看标准名称空间时适用。自定义名称可以在C#和C ++中具有您喜欢的任何短名称。 在C#中,命名空间似乎比在C ++中更“精细”。举个例子,在C ++整个标准库包含在std(加上一些微小的嵌套的命名空间一样chrono),而在C#中你有System.IO,System.Threading,System.Text等,所以,其命名冲突的风险较小。但是,这只是一种直觉。实际上,我没有计算您使用using namespace std和导入的名称using System。同样,即使这是正确的,此参数也仅在查看标准名称空间时适用。您可以在C#和C ++中将自己的代码设计为细粒度。 还有更多争论吗?我对实际的硬事实(如果有的话)特别感兴趣,而对观点却不太感兴趣。

1
这种不安全的代码是否也可以在.NET Core 3中使用?
我正在重构我的库,以Span<T>尽可能避免堆分配,但是由于我也针对较旧的框架,因此我也在实现一些通用的后备解决方案。但是现在我发现了一个奇怪的问题,我不确定是在.NET Core 3中发现了错误还是在做违法的事情。 问题: // This returns 1 as expected but cannot be used in older frameworks: private static uint ReinterpretNew() { Span<byte> bytes = stackalloc byte[4]; bytes[0] = 1; // FillBytes(bytes); // returning bytes as uint: return Unsafe.As<byte, uint>(ref bytes.GetPinnableReference()); } // This returns garbage in .NET Core 3.0 …
42 c#  stackalloc 

2
如何使用AccessibilityService在Android上执行拖动(基于X,Y鼠标坐标)?
我想知道如何在基于X,Y鼠标坐标的android上执行拖动吗?考虑两个简单的示例,Team Viewer / QuickSupport分别在远程智能手机和Windows Paint Pen上绘制“密码模式”。 我所能做的就是模拟触摸(使用dispatchGesture()和也AccessibilityNodeInfo.ACTION_CLICK)。 我找到了这些相关链接,但不知道它们是否有用: 使用AccessibilityService在屏幕上执行滑动 例子1 续手势 以下是我的工作代码,该代码用于将鼠标坐标(在PictureBox控件内部)发送到远程电话并模拟触摸。 Windows窗体应用程序: private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { foreach (ListViewItem item in lvConnections.SelectedItems) { // Remote screen resolution string[] tokens = item.SubItems[5].Text.Split('x'); // Ex: 1080x1920 int xClick = (e.X * int.Parse(tokens[0].ToString())) / (pictureBox1.Size.Width); int yClick = (e.Y * …

3
“ {}”是什么意思?
我有时会看到以下代码,却不知道该表达式实际上正在测试什么。 public static void Something(string[] value) { if (value is { }) { DoSomethingElse(); } }
36 c#  c#-8.0 

1
.NET Core中实现了哪种内存模型?
ECMA CLI规范定义了一个弱内存模型。这允许对命令执行顺序进行重新排序(这对于提高性能很有用)。但是,为这种模型编写低级代码非常困难。 最重要的是-X86 / AMD64处理器体系结构具有更严格的(强)内存模型。结果,Microsoft在其CLR实现中实现了比规范中描述的更强大的内存模型。 .NET Core中的内存模型是否已更改?该框架可能可以在内存模型比X86 / AMD64弱的体系结构上运行。 此外,.NET Core合并了Mono等。据我所知,Mono内存模型较弱,对应于ECMA。 在.NET 5简介中撰写: 通过充分利用.NET Core,.NET Framework,Xamarin和Mono来扩展.NET的功能。 因此,我认为,如果不是现在,那么将来这些运行时将合并为一个整体。 在下面的文章中写道: 我们正在相互替代CoreCLR和Mono的过程中。我们将使它像构建开关一样简单,可以在不同的运行时选项之间进行选择。 如果我理解正确,将有两个(或更多)运行时。也许每个人都会有自己的记忆模型。 我们在说什么:内存模型。
36 c#  .net-core 

1
是什么使ValueTuple协变?
这可以在C#7.3(框架4.8)中正确编译: (string, string) s = ("a", "b"); (object, string) o = s; 我知道这是下面的语法糖,它也可以正确编译: ValueTuple<string, string> s = new ValueTuple<string, string>("a", "b"); ValueTuple<object, string> o = s; 因此,看来ValueTuples可以协变地分配,真棒! 不幸的是,我不明白为什么:我给人的印象是C#只支持interface和委托的协方差。ValueType两者都不是。 实际上,当我尝试使用自己的代码复制此功能时,将失败: struct MyValueTuple<A, B> { public A Item1; public B Item2; public MyValueTuple(A item1, B item2) { Item1 = item1; Item2 = …

3
HTTP错误500.35-同一进程ASP.NET Core 3中的ANCM多个进程内应用程序
从今天早上开始,没有对项目代码进行任何更改,一个非常简单的Web API,一个控制器和3个方法以及Swagger,它不再启动,并且出现错误: HTTP错误500.35-同一进程中的ANCM多个进程内应用程序 事件查看器报告最无用的消息: IIS Express AspNetCore模块V2:无法启动应用程序'/ LM / W3SVC / 2 / ROOT / docs',错误代码'0x80004005'。 重新启动系统几次。 我正在使用Visual Studio 2019,该应用程序已成功编译,几分钟前它运行良好。没有安装新软件,没有添加软件包。也尝试过清理和重建。 我刚刚修改了方法的注释。显然,我也尝试过恢复以前的评论,但总是收到相同的消息。 我能做什么? 网核是否仍然不稳定以致无法专业使用? 更新 从同一版本的Visual Studio启动的相同代码在另一台PC上正常运行。 更新2 在应用程序代码下方: startup.cs using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Hosting; using Microsoft.OpenApi.Models; using System; using System.IO; using System.Reflection; namespace …
34 c#  asp.net-core 

3
Net Core 3.0中没有UseDatabaseErrorPage()扩展方法
我已经创建了Net Core 3.0应用程序,下面的代码现在无法在2.2中工作。 app.UseDatabaseErrorPage(); 看起来DatabaseErrorPageExtensions在Microsoft.AspNetCore.Builder名称空间中不存在3.0类。我缺少一些依赖吗?我添加了带有工具和设计的EntityFrameworkCore NuGet。 新增中 using Microsoft.AspNetCore.Builder; 没有帮助。

6
有没有办法声明C#lambda并立即调用它?
可以声明一个lambda函数并立即调用它: Func<int, int> lambda = (input) => { return 1; }; int output = lambda(0); 我想知道是否可以在一行中这样做,例如 int output = (input) => { return 1; }(0); 它给出了一个编译器错误“期望的方法名称”。强制转换为Func<int, int>不起作用: int output = (Func<int, int>)((input) => { return 1; })(0); 给出相同的错误,并且出于下面提到的原因,我想避免必须显式指定输入参数类型(第一个int)。 您可能想知道为什么我要这样做,而不是直接将代码直接嵌入,例如int output = 1;。原因如下:我已经使用生成了SOAP Web服务的引用svcutil,由于嵌套的元素会生成非常长的类名,因此我希望避免键入它。所以代替 var o = await client.GetOrderAsync(request); return new …
29 c#  lambda 


3
为什么在使用Invoke方法时编译正常,而直接返回Func <int,int>却不正常?
我不了解这种情况: public delegate int test(int i); public test Success() { Func&lt;int, int&gt; f = x =&gt; x; return f.Invoke; // &lt;- code successfully compiled } public test Fail() { Func&lt;int, int&gt; f = x =&gt; x; return f; // &lt;- code doesn't compile } 为什么在使用Invoke方法时编译正常,而csharp Func&lt;int,int&gt;直接返回时却正常?
28 c#  lambda  delegates 

2
创建空的IAsyncEnumerable
我有一个这样写的接口: public interface IItemRetriever { public IAsyncEnumerable&lt;string&gt; GetItemsAsync(); } 我想编写一个不返回任何项目的空实现,如下所示: public class EmptyItemRetriever : IItemRetriever { public IAsyncEnumerable&lt;string&gt; GetItemsAsync() { // What do I put here if nothing is to be done? } } 如果可以使用普通的IEnumerable,我可以return Enumerable.Empty&lt;string&gt;();,但是没有找到任何东西AsyncEnumerable.Empty&lt;string&gt;()。 解决方法 我发现这可行,但是很奇怪: public async IAsyncEnumerable&lt;string&gt; GetItemsAsync() { await Task.CompletedTask; yield break; } 任何的想法?

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.