小编cog*_*el0的帖子

检查功能中是否存在参数

我有如下功能:

function T
{
    Param
    (
        [switch] $IsValueNameRegularExpression
    )

    ..
}
Run Code Online (Sandbox Code Playgroud)

通常要确定参数是否存在if ($Param),只能看到这是a [switch],如果调用该函数T -IsValueNameRegularExpression:$false将返回false if ($IsValueNameRegularExpression),即使参数存在 - 即调用者为可选参数指定了值.

如果我从改变参数类型[switch],以[bool]同样的事情会发生,很明显.

在我的函数的代码中,我调用一些.NET方法,其中包含我的[bool]`[switch]`参数的默认设置,所以除非用户指定了一个值(是真或假),我不想将它传递给.NET方法.

我可以为参数指定默认值以匹配.NET方法的默认值,但这可以假设.NET方法的默认值永远不会改变,这可能不是真的......

那么,有更优雅的方式吗?

powershell

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

将null传递给函数的必需参数

从scrath重写的问题使其更具可读性.

实际上我的问题归结为:

我不能有一个带有强制参数的函数,并将$ null传递给该参数:

Function Foo
{
    Param
    (
        [Parameter(Mandatory = $true)][string] $Bar
    )

    Write-Host $Bar
}

Foo -Bar $null
Run Code Online (Sandbox Code Playgroud)

这回来了 foo : Cannot bind argument to parameter 'Bar' because it is an empty string.

同样,使它成为一个数组也失败了:

Function Foo
{
    Param
    (
        [Parameter(Mandatory = $true)][string[]] $Bar
    )

    Write-Host $Bar
}

Foo -Bar 1, 2 

> 1 2

Foo -Bar 1, 2, $null

> foo : Cannot bind argument to parameter 'Bar' because it is an empty string.
Run Code Online (Sandbox Code Playgroud)

它编程术语完全有可能有一个接受强制可为空参数的函数,但我找不到在PowerShell中这样做的方法.

怎么做?

powershell

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

Dapper - 如何使用动态对象

我正在使用Dapper从SQL查询并具有动态查询:

var returns = conn.Query(dynamicQuery);
Run Code Online (Sandbox Code Playgroud)

当我循环查看结果时,我想知道我正在处理的日期类型是什么,所以我尝试执行以下操作:

foreach (var result in results)
{
    MessageBox.Show(result.GetType().ToString());
}
Run Code Online (Sandbox Code Playgroud)

但它总是MessageBox在错误上失败Cannot perform runtime binding on a null reference.

如果我改用它:

var returns = conn.Query<object>(dynamicQuery);
Run Code Online (Sandbox Code Playgroud)

然后命令工作,但它给了我一个Dapper.SqlMapper+DapperRow对象类型.

如何找到dynamic变量的类型?

c# dynamic dapper

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

要关闭套接字,请不要关闭()套接字.Uhmm?

我知道TIME_WAIT是TCP/IP的一个组成部分,但是在SO(和其他地方)有很多问题,每秒创建多个套接字,服务器最终耗尽短暂的端口.

我发现的是,当使用TCPClient(或者Socket就此而言)时,如果我调用了Close()或者Dispose()方法,则套接字的TCP状态变为TIME_WAIT并且将在完全关闭之前考虑超时时间.

但是,如果只是将变量设置null为套接字将在下一次GC运行时完全关闭,这当然可以强制执行,而不会经历TIME_WAIT状态.

这对我来说没有多大意义,因为这是一个IDisposable对象不应该GC也调用Dispose()对象的方法?

这是一些PowerShell代码,演示了(在这台机器上没有安装VS).我使用Sysinternals的TCPView实时检查套接字状态:

$sockets = @()
0..100 | % {
    $sockets += New-Object System.Net.Sockets.TcpClient
    $sockets[$_].Connect('localhost', 80)
}

Start-Sleep -Seconds 10

$sockets = $null

[GC]::Collect()
Run Code Online (Sandbox Code Playgroud)

使用此方法,套接字永远不会进入TIME_WAIT状态.同样的,如果我只是手动调用之前关闭该应用程序Close()Dispose()

有人可以解释一下是否这是一个好习惯(我想人们会说这不是).

编辑

GC已经回答了这个问题,但我仍然有兴趣找出为什么这会对套接字状态产生任何影响,因为这应该由操作系统控制,而不是.NET.

还有兴趣了解使用此方法来防止TIME_WAIT状态并最终是否是某个地方的错误(即,所有套接字是否应该通过TIME_WAIT状态?)是否是一个好习惯?

.net c# sockets powershell

12
推荐指数
2
解决办法
2536
查看次数

读取流:Byte[] vs Memory&lt;Byte&gt; vs Span&lt;Byte&gt;

以下之间的根本区别是什么:

var buffer = new byte[8192];
var bytesRead = Stream.Read(buffer, 0, buffer.Length);
Run Code Online (Sandbox Code Playgroud)
var buffer = new byte[8192];
var span = new Span<byte>(buffer);
var bytesRead = Stream.Read(span);
Run Code Online (Sandbox Code Playgroud)
var buffer = new byte[8192];
var memory = new Memory<byte>(buffer);
var bytesRead = Stream.ReadAsync(memory).Result;
Run Code Online (Sandbox Code Playgroud)

排除一个明显的事实,即它们都是不同的对象类型,并且唯一Stream.Read()接受 a 的方法当然Memory<Byte>是。ReadAsync()

为什么我会选择其中任何一个byte[]Span<byte>Memory<byte>不是其他,我将如何决定什么最适合我的情况?

.net c# .net-core

11
推荐指数
1
解决办法
7018
查看次数

格式化DateTime - 忽略文化

我需要将日期格式化为以下格式:

M-d-yyyy

我试过用:

string.Format("{0:M-d-yyyy}", DateTime.Now)

但输出字符串将取决于运行它的计算机上的CurrentCulture,因此有时输出可能是07/09/201407.09.2014代替09-07-2014.

我怎样才能轻易地阻止它根据文化转换它并将其视为文字字符串?

c#

6
推荐指数
2
解决办法
5474
查看次数

C#中的C++联合 - 奇怪的行为

我正在尝试使用C#中的VHD API创建一些vhd/vhdx文件.

有一个C++联合看起来像这样:

typedef struct _CREATE_VIRTUAL_DISK_PARAMETERS
{
    CREATE_VIRTUAL_DISK_VERSION Version;

    union
    {
        struct
        {
            GUID                  UniqueId;
            ULONGLONG             MaximumSize;
            ULONG                 BlockSizeInBytes;
            ULONG                 SectorSizeInBytes;
            PCWSTR                ParentPath;
            PCWSTR                SourcePath;
        } Version1;

        struct
        {
            GUID                   UniqueId;
            ULONGLONG              MaximumSize;
            ULONG                  BlockSizeInBytes;
            ULONG                  SectorSizeInBytes;
            ULONG                  PhysicalSectorSizeInBytes;
            PCWSTR                 ParentPath;
            PCWSTR                 SourcePath;
            OPEN_VIRTUAL_DISK_FLAG OpenFlags;
            VIRTUAL_STORAGE_TYPE   ParentVirtualStorageType;
            VIRTUAL_STORAGE_TYPE   SourceVirtualStorageType;
            GUID                   ResiliencyGuid;
        } Version2;

        struct
        {
            GUID                   UniqueId;
            ULONGLONG              MaximumSize;
            ULONG                  BlockSizeInBytes;
            ULONG                  SectorSizeInBytes;
            ULONG                  PhysicalSectorSizeInBytes;
            PCWSTR                 ParentPath;
            PCWSTR                 SourcePath;
            OPEN_VIRTUAL_DISK_FLAG OpenFlags;
            VIRTUAL_STORAGE_TYPE   ParentVirtualStorageType;
            VIRTUAL_STORAGE_TYPE   SourceVirtualStorageType;
            GUID                   ResiliencyGuid;
            PCWSTR                 SourceLimitPath;
            VIRTUAL_STORAGE_TYPE …
Run Code Online (Sandbox Code Playgroud)

c# c++ pinvoke

6
推荐指数
1
解决办法
221
查看次数

IReadOnlyCollection与ReadOnlyCollection

SO上已经有几个类似的问题了,但是我发现的这些问题都没有真正涉及到这个特定主题,所以这里有......

我的理解是,应该总是尝试在具体类上返回接口.不会深究其背后的原因,关于那已经有很多事情了.

但是在IReadOnlyCollectionvs 的情况下,ReadOnlyCollection我不确定是否应该遵循该规则.

一个IReadOnlyCollection可以很容易地被铸成一个List......好吧...... 打破ReadOnly了合同所承诺的方面.

ReadOnlyCollection但是不能投入一个List,但它意味着返回一个具体的类.

从长远来看,它真的重要吗?在我看来,在大多数情况下,ReadOnly*/IReadOnly*对象仅由方法或只读属性返回.

因此,即使用户决定将其转换为其他东西(在IReadOnly*对象的情况下)或使用LINQ来创建某种类型的集合(在ReadOnly*对象的情况下),实际上没有办法让类暴露出来ReadOnly*/IReadOnly*对象将接受回来.

那么这里的建议是什么,返回一个IReadOnly*接口或一个具体的ReadOnly*类实例?

.net c# linq

6
推荐指数
2
解决办法
2563
查看次数

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\&lt;SID&gt; 状态值含义

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\<SID>State包含一个称为位掩码的值DWORD

我能找到的有关它的所有信息是这样的:

001 = PROFILE_MANDATORY
Profile is mandatory.

002 = PROFILE_USE_CACHE
Update locally Cached profile.

004 = PROFILE_NEW_LOCAL
Using a new local profile.

008 = PROFILE_NEW_CENTRAL
Using a new central profile.

010 = PROFILE_UPDATE_CENTRAL
Need to update central profile.

020 = PROFILE_DELETE_CACHE
Need to delete cached profile.

040 = PROFILE_UPGRADE
Need to upgrade profile.

080 = PROFILE_GUEST_USER
Using guest user profile.

100 = PROFILE_ADMIN_USER
Using administrator profile.

200 = DEFAULT_NET_READY
Default net profile is available …
Run Code Online (Sandbox Code Playgroud)

.net c# windows registry

5
推荐指数
0
解决办法
5404
查看次数

带有CompositeCollection的WPF ComboBox - SelectedIndex不粘

我正在使用带有CompositeCollection的ComboBox,如下所示:

<ComboBox>
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <ComboBoxItem Content="All"></ComboBoxItem>
            <CollectionContainer Collection="{Binding Source={StaticResource AllBitsSource}}" />
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)

显示的数据完全符合预期,我现在只想将默认索引/值/项设置为包含内容All的ComboBoxItem,并且遇到一些问题.

如果我设置:

<ComboBoxItem Content="All" IsSelected="True"/>
Run Code Online (Sandbox Code Playgroud)

这完全被忽略了.

我也尝试过:

<ComboBox SelectedIndex="0">
Run Code Online (Sandbox Code Playgroud)

虽然这确实选择了All值,但是当我打开下拉列表时,突出显示的值是加载到ComboBox上的最后一个值,而不是All值.

我如何解决这个问题,以便在数据绑定后我的ComboBoxItem内容保持选中状态?

编辑:

我刚刚尝试用<CollectionContainer>另一个替换我的<ComboBoxItem>工作方式很好,即使他们仍然在里面<CompositeCollection>.

EDIT2:

图像显示问题所在:

图片

EDIT3:

AllBitsSource的代码:

XAML:

<Window.Resources>
    <CollectionViewSource x:Key="AllBitsSource" Source="{Binding Path=AllBits}" />
Run Code Online (Sandbox Code Playgroud)

代码背后:

private readonly ObservableCollection<string> _bits = new ObservableCollection<string>();

private void GetCurrentSettings()
{
    setttings = display.GetDisplaySettings();

    foreach (var mode in setttings)
    {
        var displaySettingInfoArray = mode.GetInfoArray();

        if (_bits.Contains(displaySettingInfoArray[4]) == false)
        {
            _bits.Add(displaySettingInfoArray[4]);
        }
    }
}

public ObservableCollection<string> …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml

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

标签 统计

c# ×8

.net ×4

powershell ×3

.net-core ×1

c++ ×1

dapper ×1

dynamic ×1

linq ×1

pinvoke ×1

registry ×1

sockets ×1

windows ×1

wpf ×1

xaml ×1