我有如下功能:
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方法的默认值永远不会改变,这可能不是真的......
那么,有更优雅的方式吗?
从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中这样做的方法.
怎么做?
我正在使用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变量的类型?
我知道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状态?)是否是一个好习惯?
以下之间的根本区别是什么:
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>不是其他,我将如何决定什么最适合我的情况?
我需要将日期格式化为以下格式:
M-d-yyyy
我试过用:
string.Format("{0:M-d-yyyy}", DateTime.Now)
但输出字符串将取决于运行它的计算机上的CurrentCulture,因此有时输出可能是07/09/2014或07.09.2014代替09-07-2014.
我怎样才能轻易地阻止它根据文化转换它并将其视为文字字符串?
我正在尝试使用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) SO上已经有几个类似的问题了,但是我发现的这些问题都没有真正涉及到这个特定主题,所以这里有......
我的理解是,应该总是尝试在具体类上返回接口.不会深究其背后的原因,关于那已经有很多事情了.
但是在IReadOnlyCollectionvs 的情况下,ReadOnlyCollection我不确定是否应该遵循该规则.
一个IReadOnlyCollection可以很容易地被铸成一个List......好吧...... 打破ReadOnly了合同所承诺的方面.
ReadOnlyCollection但是不能投入一个List,但它意味着返回一个具体的类.
从长远来看,它真的重要吗?在我看来,在大多数情况下,ReadOnly*/IReadOnly*对象仅由方法或只读属性返回.
因此,即使用户决定将其转换为其他东西(在IReadOnly*对象的情况下)或使用LINQ来创建某种类型的集合(在ReadOnly*对象的情况下),实际上没有办法让类暴露出来ReadOnly*/IReadOnly*对象将接受回来.
那么这里的建议是什么,返回一个IReadOnly*接口或一个具体的ReadOnly*类实例?
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) 我正在使用带有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)