一些程序员认为最好将IEnumerable<T>参数传递给传递的实现,例如List<T>,这样做的一个常见原因是API可以在更多场景中立即使用,因为更多的集合将与IEnumerable<T>任何其他特定实现兼容,例如List<T>.
我越是深入研究多线程开发场景,我就越开始认为这IEnumerable<T>也不是正确的类型,我将尝试解释下面的原因.
枚举集合时是否收到过以下异常?
收集被修改; 枚举操作可能无法执行.(InvalidOperationException)

基本上导致这种情况的原因是,您在一个线程上获得了集合,而其他人在另一个线程上修改了该集合.
为了解决这个问题,我开始习惯在枚举之前拍摄集合的快照,方法是将集合转换为方法内的数组,如下所示:
static void LookAtCollection(IEnumerable<int> collection)
{
foreach (int Value in collection.ToArray() /* take a snapshot by converting to an array */)
{
Thread.Sleep(ITEM_DELAY_MS);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是这个.作为一般规则,对数组而不是枚举进行编码不是更好吗,即使这意味着调用者现在被迫在使用API时将其集合转换为数组?
这不是更清洁,更防弹吗?(参数类型是一个数组而不是)
static void LookAtCollection(int[] collection)
{
foreach (int Value in collection)
{
Thread.Sleep(ITEM_DELAY_MS);
}
}
Run Code Online (Sandbox Code Playgroud)
该数组满足可枚举和固定长度的所有要求,并且调用者知道您将在该时间点对集合的快照进行操作,这可以节省更多错误.
我现在能找到的唯一更好的选择是IReadOnlyCollection,它将更加防弹,因为该集合在项目内容方面也是只读的.
编辑:
@DanielPryden提供了一篇非常好的文章"Arrays被认为有害"的链接.作者的评论"我很少需要一个具有相当矛盾的特性,完全可变,同时又大小固定"和"几乎在所有情况下都有一个比一个更好的工具使用的集合".阵".有点让我相信阵列不像我希望的那样接近银弹,我同意风险和漏洞.我认为现在IReadOnlyCollection<T>接口是一个比数组和接口更好的选择IEnumerable<T>,但它现在让我有一个问题:被调用者是否通过IReadOnlyCollection<T>在方法声明中使用参数类型来强制执行它?或者是否应该允许调用者决定将哪些实现 …
在我的Visual Studio扩展中,我显示相关文件.
我有可以在Visual Studio中打开文件的代码.
我想要可以预览文件的代码
这是我用来使用DTE2对象打开文件的代码.但是我该如何预览文件呢?
public void ViewFile(FileInfo file)
{
if (null == file)
throw new ArgumentNullException(nameof(file));
var dte2 = (EnvDTE80.DTE2)DTE;
dte2.MainWindow.Activate();
var newWindow = dte2.ItemOperations.IsFileOpen(file.FullName)
? FindWindow(file.FullName)
: dte2.ItemOperations.OpenFile(file.FullName);
newWindow.Activate();
}
Run Code Online (Sandbox Code Playgroud)
这是一个预览文件,如果您在解决方案资源管理器中单击它:
如果您在解决方案资源管理器中双击它,或者对预览文件进行更改,则这是一个打开的文件:
当用户安装我的扩展程序但未安装最新的Visual Studio更新时,该扩展程序无法解析Microsoft.CodeAnalysis.CSharp.dll,并显示以下消息:
无法加载文件或程序集“ Microsoft.CodeAnalysis.CSharp,版本= 1.2.0.0,区域性=中性,PublicKeyToken = 31bf3856ad364e35”或其依赖项之一。该系统找不到指定的文件。
我确保扩展名确实引用了该程序集,并且确实引用了该程序集,但是为什么将此程序集从VSIX文件中排除?
我将VSIX文件重命名为ZIP,查看了其中的内容,尽管VSIX文件中包含其他“ Microsoft.CodeAnalysis。*。dll”程序集,但该程序集并未交付。
我还确认引用上的“ 复制本地 ”属性为True。
抱歉,如果这是一个愚蠢的问题,但是为什么 dockerfile 在发布也构建时包含构建和发布的步骤?
在我的 Web 应用程序中创建了以下 Dockerfile:
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . .
WORKDIR "/src/WebApplication1"
RUN dotnet build "WebApplication1.csproj" -c Release -o /app
FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]
Run Code Online (Sandbox Code Playgroud) 安装Visual Studio 2017后,我能够使用此Vs包一个月左右,直到第一次更新.现在,在我重建这个Visual Studio包,然后尝试安装VSIX之后,我收到一条消息,说它是一个"无效的VSIX包".
任何帮助或指示将不胜感激......
编辑:
日志显示:
无法找到名为"?"的入口点 在DLL'PkgdefMgmt.dll'中
19/03/2017 10:16:02 PM - Microsoft VSIX Installer 19/03/2017 10:16:02 PM - ----------------------- -------------------- 19/03/2017 10:16:02 PM - vsixinstaller.exe版本:19/03/2017 10:16:02 PM - 15.0 .26228.9建造者:D15RTWSVC 19/03/2017 10:16:02 PM - -------------------------------- ----------- 19/03/2017 10:16:02 PM - 命令行参数:19/03/2017 10:16:02 PM - C:\ Program Files(x86)\ Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VSIXInstaller.exe,C:\ Service\BSToolsProject_3\Tools\ProductivityTools\Bin(Scenario Engine)\ Capitec.ScenarioEngineExtension.vsix 19/03/2017 10:16:02 PM - - ----------------------------------------- 19/03/2017 10:16: 02 PM - Microsoft VSIX Installer 19/03/2017 10:16:02 PM - -------------------------------- ----------- 19/03/2017 10:16:02 PM - 无法初始化Isolated …
我首先写了一个DiagnosticAnalyzer,然后努力让它加载,直到我在 VSIX 清单中将它的项目列为资产。
现在我还向CodeFixProvider与分析器相同的项目添加了一个,但它没有加载。
我错过了什么?
我尝试了以下方法:
类型构造函数以及实例构造函数和任何方法中的断点表明代码修复程序中没有任何内容被加载,也没有任何内容被命中。
这是代码修复程序的代码:
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
using System.Collections.Immutable;
using System.Composition;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Capitec.CodeAnalysis.Diagnostics
{
[ExportCodeFixProvider(LanguageNames.CSharp), Shared]
public sealed class UserInteractionCodeFixProvider : CodeFixProvider
{
private const string Title = "Invoke mapped function instead";
static UserInteractionCodeFixProvider()
{
}
public UserInteractionCodeFixProvider()
{
}
public override ImmutableArray<string> FixableDiagnosticIds =>
ImmutableArray.Create( …Run Code Online (Sandbox Code Playgroud) 我使用以下代码将新的 json 文本分配给文档:
public virtual async Task SetDocumentText(FileInfo fileInfo, string contents)
{
if (fileInfo == null)
throw new ArgumentNullException(nameof(fileInfo));
var projectItem = FindDTEProjectItem(fileInfo.FullName);
if (null == projectItem?.Document)
await Task.Run(() => fileInfo.WriteAllText(contents));
else
{
var textSelection = (TextSelection)projectItem.Document.Selection;
textSelection.SelectAll();
textSelection.Text = contents;
projectItem.Document.Save();
}
}
Run Code Online (Sandbox Code Playgroud)
但是我目前的解决方案存在三个问题:
有没有更好的方法将新文本分配给 EnvDTE.Document?
这是损坏的文本的样子:
但这是我分配的:
...
...
},
"client": {
"title": "Mr"
}
}
Run Code Online (Sandbox Code Playgroud)
我分配的 json 文本是有效且格式良好的,即使不是,我也不希望 json 文本出现如此严重的损坏。
如果我将文本直接写入文件,那么 Visual Studio 将询问用户是否要重新加载,我也试图避免该弹出窗口。
任何帮助,将不胜感激。我无法成功使用 roslyn 和 TextDocument,因为我无法加载 AdditionalDocument。roslyn 项目文档集合中仅包含代码文件。
c# json envdte visual-studio-extensions roslyn-code-analysis
c# ×6
vsix ×3
.net ×1
asp.net-core ×1
collections ×1
dockerfile ×1
envdte ×1
ienumerable ×1
json ×1
roslyn ×1