使用 get_Keys() 方法进行集合是否正确

2023-12-02

与此问题相关:我可以将名为“keys”的键添加到哈希表而不覆盖“keys”成员吗,我实际上经常使用get_Keys() method作为推荐的PSBase property只会转移问题。
换句话说,在解决方案如下的情况下,对于未知的目录键列表,此方法显得特别方便:Powershell Merge 2 列出性能.

该方法按预期工作(也适用于其他集合、任何 PowerShell 版本和 .Net Core):

$Hash = @{Keys = 'MyKeys'; PSBase = 'MyPSBase'}
$Hash.get_Keys()
PSBase
Keys

The get_Keys()方法显然源自:

$Hash.get_Keys

OverloadDefinitions
-------------------
System.Collections.ICollection get_Keys()
System.Collections.ICollection IDictionary.get_Keys()

关键是我无法找到我在哪里找到对此的推荐get_Keys()方法,而且几乎没有任何关于该方法的文档。
使用这种方法安全吗?


get_Keys()确实是一种有效的(也是推荐的)访问方式the Keys财产字典的内容,而不会有与用户定义的键发生冲突的风险。

该方法按预期工作(也适用于其他集合、任何 PowerShell 版本和 .Net Core):

请注意,这仅适用于字典 ([hashtable], [ordered], [SortedList]等) - 因为它继承自the System.Collections.IDictionary界面.

原因get_Keys()公共文档中没有列出的是它故意隐藏.

要了解其原因,我们首先需要了解其本质特性 in .NET

.NET 中的属性

在 .NET 中,数据类型可以有不同种类members。在下面的 (C#) 示例中,我们定义一个具有两个成员的类,一个field and a method:

class MyClass
{
    int MyField;

    int MyMethod(string n = "")
    {
        return int.Parse(n);
    }
}

这里值得注意的有趣的事情是,该字段就像变量一样- 我们可以引用它来获取存储在其中的任何整数的值MyField我们可以为其分配一个(新)值。另一方面,该方法就像一个函数一样- 我们可以调用它,包括向它传递参数值,并且它可以返回一个值。

但是 .NET 有第三种成员类型,它的作用有点像hybrid在字段和方法之间,它看起来有点像这样(在字典的情况下):

class MyDictionary
{
    string[] _keys;
    
    public string[] Keys
    {
        get
        {
            return _keys;
        }
        set
        {
            throw new InvalidOperationException("Don't mess with the keys!");
        }
    }
}

这被称为property- 从用户的角度来看,Keys属性的行为就像一个字段 - 我们可以引用它来解析它的值,并且我们可以(尝试)分配给它 - 但从实现者的角度来看,我们对其行为有更多的控制,比如能够(有条件地)抛出分配时的例外情况。

现在,当编译上面的代码时,C#编译器需要存储get and set方法某处以便 CLR 知道当有人尝试解决问题时要执行它们Keys运行时的成员。

约定是将它们生成为常规类方法,通过前缀命名get_ and set_到有问题的属性名称。编译器进一步用以下标记这些方法SpecialName属性标志,允许编辑器和分析器将它们隐藏在用户界面和自动完成器中 - 这正是方法名称不会自动显示在智能感知等中的原因。

发现属性 getter/setter

*在 PowerShell 类中,成员始终是methods or 特性,因此在下面我将使用此 PowerShell 类定义作为示例:

class StackOverflowUser
{
  [string]$Name
  [int]$ID

  StackOverflowUser([string]$name, [int]$id)
  {
    $this.Name = $name
    $this.ID   = $ID
  }
}

$Mathias = [StackOverflowUser]::new("Mathias R. Jessen", 712649)

Using Get-Member

您可以使用以下方法发现与属性关联的自动 getter 和 setterGet-Member -Force:

PS C:\> $Mathias |Get-Member ?et_* -Force


   TypeName: StackOverflowUser

Name     MemberType Definition
----     ---------- ----------
get_ID   Method     int get_ID()
get_Name Method     string get_Name()
set_ID   Method     void set_ID(int )
set_Name Method     void set_Name(string )

在这里我们可以看到与相关的 getter 和 setter 方法$ID and $Name.

使用反射

我们也可以直接从[type] object:

PS C:\> $IDPropertyInfo = [StackOverflowUser].GetProperty("ID")
PS C:\> $IDPropertyInfo.GetMethod

Name                       : get_ID
DeclaringType              : StackOverflowUser
ReflectedType              : StackOverflowUser
MemberType                 : Method
MetadataToken              : 100663299
Module                     : RefEmit_InMemoryManifestModule
IsSecurityCritical         : True
IsSecuritySafeCritical     : False
IsSecurityTransparent      : False
MethodHandle               : System.RuntimeMethodHandle
Attributes                 : PrivateScope, Public, HideBySig, SpecialName
CallingConvention          : Standard, HasThis
ReturnType                 : System.Int32
ReturnTypeCustomAttributes : Int32
ReturnParameter            : Int32
IsCollectible              : True
IsGenericMethod            : False
IsGenericMethodDefinition  : False
ContainsGenericParameters  : False
MethodImplementationFlags  : Managed
IsAbstract                 : False
IsConstructor              : False
IsFinal                    : False
IsHideBySig                : True
IsSpecialName              : True
IsStatic                   : False
IsVirtual                  : False
IsAssembly                 : False
IsFamily                   : False
IsFamilyAndAssembly        : False
IsFamilyOrAssembly         : False
IsPrivate                  : False
IsPublic                   : True
IsConstructedGenericMethod : False
CustomAttributes           : {}

请注意,上面的 getter 有SpecialName如上所述的属性

注意:上面的输出来自 PowerShell 7,将是slightly由于 .NET Core 中反射/类型系统 API 的更改,Windows PowerShell 中有所不同

我希望这能解释:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 get_Keys() 方法进行集合是否正确 的相关文章

  • 更改 NHibernate Session.Save 命令超时

    我们有几个长时间运行的后端进程 其运行时间超过默认的 30 秒 我们的NHibernate版本是2 0 1 4000 Spring NET是1 2 0 20313 NHibernate 通过 Spring NET 进行配置
  • 如何让CQRS适应项目? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我发现了一个新术语 名叫CQRS 命令查询职责分离 http martinfowler com bliki CQRS html其中指出 概念模型
  • SQL Server 2008:如何使用 powershell 获取“消息”选项卡(在 Management Studio 中)输出

    我在用invoke sqlcmd管理我的数据库 它工作得很好 我将 Management Studio 中 结果 选项卡的输出保存到日志文件中 当我做一个BACKUP DATABASE 输出是在 消息 选项卡上完成的 我想将其保存在日志文件
  • 如何使用 PowerShell 2 的导出 csv 附加文件?

    filesremoved export csv Path E Code powershell logs filesremoved txt NoTypeInformation 我也尝试过 filesremoved export csv Pat
  • Python - 如何查询定义方法的类?

    我的问题有点类似于this one https stackoverflow com questions 5520580 how do you get all classes defined in a module but not impor
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 使对象在运行时不可变 [C#]

    有什么方法 我希望利用反射 可以使实例化对象不可变及其所有公共财产 我有一个来自其他人的代码库 没有可用源 的类 我需要使用它 并且我基本上希望在实例化该类后 如果任何地方的任何代码段尝试调用该类中的公共设置器 则抛出异常 注意 我不想在类
  • 是否需要连续编号?

    我正在开发一个 winform NET 应用程序 其中包括订单 发票 服务订单 票务等 这些实体在对其 ID 进行编号时是否必须按顺序排列 国际海事组织没有 以一个订单为例 它只有通过业务层才有效 在此过程中 可能已经创建了另一个订单 批准
  • 绑定 WebForms TextBox 上的千位分隔符的逗号

    我正在尝试如下格式化数据绑定值 但我不断得到一个空格作为千 位分隔符 即显示的文本始终是 12 340 00 而它应该是 12 340 00 我缺少什么
  • 如何按顺序而不是并行等待 C# 任务?

    我有一组异步测试 它们在外部硬件上运行 我可以按顺序运行它们 但因为所有这些测试都有副作用 所以我希望能够重新排列它们并一遍又一遍地运行它们 当我将它们放入列表中并尝试等待每个之后 它们全部并行运行 而不是 1 个 1 个运行 我希望能够打
  • WPF Window 类的 IDisposable 成员

    当我将 IDisposable 类成员添加到 Windows 窗体 Form 类时 我将处置代码添加到 Form 的 Dispose 方法中 当我将 IDisposable 类成员添加到 WPF Window 类 不是 IDisposabl
  • 在 C++/CLI 中实现 IEnumerable

    我在实施时遇到问题IEnumerable
  • 将 null 投射到某物中?

    今天我和一位同事进行了一次有趣的讨论 我们正在讨论两段 C 代码 代码片段 1 if reader IsDBNull 2 long variable1 reader GetInt64 2 代码片段2 long variable1 reade
  • 带有多个附件的电子邮件

    我正在为服务台编写一个 PowerShell 脚本 以便在将 userhome 文件夹从服务器迁移到 NAS 设备时使用 帮助台用户将用户名输入到 userhomelist txt 文件中 我的问题是我无法获取脚本来附加所有日志文件 电子邮
  • 什么是 System.ContextBoundObject?

    What is 上下文绑定对象 http msdn microsoft com en us library system contextboundobject aspx用于 该文档提到了 上下文 它似乎是以编程方式定义的 但未能给出任何解释
  • 抑制数组列表添加方法管道输出

    我正在使用数组列表来构建日志项序列以供稍后记录 工作起来很不错 但是 Add 方法将当前索引发送到管道 我可以通过将其发送到 null 来解决这个问题 如下所示 strings Add junk gt null 但我想知道是否有某种机制可以
  • 计算文本框中换行的行数

    我在文本框中有一行文本 并且换行为多行 如何计算文本框中换行的行数 你可以使用String Split int lineCount txt Text Split new n r StringSplitOptions None Length
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • Get-AzureStorageBlob 抛出找不到您的 azure 存储凭据

    我刚刚开始使用 Azure 在使用 PowerShell cmdlet 处理我的存储帐户时遇到问题 我已经创建了一个存储帐户并在该存储帐户中创建了一个容器 接下来 我安装了 Azure Powershell SDK 和命令让等 并导入了pu
  • Powershell 中的“$”是什么?

    是什么意思 在 Powershell 中 Edit TechNet 答案 http technet microsoft com en us library hh847768 aspx同义反复 没有解释 成功 或 失败 的含义 包含上次操作的

随机推荐

  • 为什么亚马逊广告报告 API 返回 .bin 而不是 .json

    我正在向亚马逊广告 API 请求一份赞助产品报告 当我发送 POST 时 我收到了 reportID 我输入 reportID 作为 GET 调用的路径的一部分来检索文档 我观察到类型 20 的响应 但是响应的内容是二进制代码 我认为 文档
  • C# 检查字符串是否为数字的代码

    我正在使用 Visual Studio 2010 我想检查一个字符串是否是数字 是否有任何内置函数来检查这一点 或者我们是否需要编写自定义代码 你可以使用int TryParse方法 例子 string s int result if in
  • DirectShow USB 网络摄像头更改视频源

    嘿 我正在尝试找到将我的网络摄像头上的视频源更改为 复合 的设置 似乎如果我拔掉 USB 然后重新插入并启动代码 它就会出现一个空白屏幕 但是 一旦我更改视频源 在另一个程序中 然后返回并再次运行我的代码 它就会出现 因此 我需要一些可以让
  • 在 .NET 中从 SQL Server 捕获 RAISERROR

    我在 SQL Server 中有一个存储过程 每当满足条件时就会引发错误 为了捕获此错误并将其显示给用户 我使用 try code catch Exception e return BadRequest e Message 这涵盖了大多数情
  • javascript循环仅适用于所有其他元素

    完成 ajax 查询后 我有以下 javascript 我所有的图片都有 name pic
  • 使用 PyMongo 将 Pandas Dataframe 插入 mongodb

    使用将 pandas DataFrame 插入 mongodb 的最快方法是什么PyMongo Attempts db myCollection insert df to dict 给出了一个错误 InvalidDocument docum
  • 使用标签应用动态过滤器

    我有一个元素列表 使用 ng repeat 显示在表格中 我想应用使用标签添加的动态过滤器 ng 标签输入 此标签输入生成动态标签 我想将其用作过滤器 这里是plunk我创造了 如何使用这些标签中的条目来创建过滤器 对于我尝试过的单个元素
  • 使用 VBA 将网站打印为 PDF

    我正在尝试使用 VBA 将 HTML 保存为 PDF 我不知道如何检查默认打印机是什么 将其更改为 Microsoft Print to PDF 然后返回旧打印机 下面是我的代码 我在 Google 上搜索一些内容 然后在第一个 Googl
  • 有没有办法自动在所有 C 或 CPP 文件中包含头文件? [复制]

    这个问题在这里已经有答案了 可能的重复 如何通过makefile包含头文件 我正在使用 gcc 来编译我的代码 我也有一些 make 文件 我可以告诉编译器包含一个特定的头文件以自动包含在所有 CPP 文件中吗 我怎样才能做到这一点 添加适
  • 根据另一个值存储数组的项目

    我有一个名为 Catalog 的数组 其中包含 4 个项目 packageid dataid categoryid 和 datapackage 我想做的就是推入数组dataids其项目的所有 dataidpackageid等于package
  • 使用 SwingWorker 和 Timer 在标签上显示时间?

    我想要一个显示当前时间并每秒刷新的时钟 我正在使用的代码是 int timeDelay 1000 ActionListener time time new ActionListener Override public void action
  • MemoryStream 中的 UWP BitmapImage SetSource 挂起

    在我的 UWP 应用程序中 我以 byte 的形式将图像存储在 SQLite 数据库中 然后 当我从数据库检索对象时 我将它们绑定到具有图像控件的 GridView 数据模板 由于我无法将图像的源直接绑定到数组 因此我在对象的类中创建了一个
  • 如何从 jQuery 的 $.ajax() 函数调用 servlet

    我试图从 jQuery 的 ajax 函数调用 servlet 目前 我认为我什至没有调用 servlet 或向其传递参数 但是大量谷歌搜索似乎没有帮助 有任何想法吗 这是我的html
  • 这是使用浮点值进行输入验证的正确方法吗?

    在花费了大量时间研究输入验证之后 我结合了一些想法并提出了这个 检查字符串是否有效的函数double bool isDouble double destination string source 64 bit bool goodValue
  • 如何在 Groovy 中创建和访问全局变量?

    我需要在一个方法中的变量中存储一个值 然后需要在另一个方法或闭包中使用该变量中的该值 我如何分享这个价值 在 Groovy 脚本中 作用域可能与预期不同 这是因为 Groovy 脚本本身就是一个具有运行代码方法的类 但这都是在运行时完成的
  • SSIS 包在调试时立即取消

    我有一个相当简单的 SSIS 包 我已经多次使用它来将制表符分隔的文件导入到数据库中的单个表中 我将新的源文件附加到包中并尝试运行该包 包开始了 cmd 提示符会短暂出现 然后消失 然后该进程在平面文件源组件上退出 输出显示如下 SSIS
  • 有没有办法告诉 crossfilter 将数组元素视为单独的记录,而不是将整个数组视为单个键?

    我有一个数据集 其中一些字段值是数组 我想使用 crossfilter 和 d3 js 或 dc js 来显示每个值在数据集中出现的次数的直方图 这是一个例子 var data key KEY 1 tags tag1 tag2 key KE
  • 如何在 LayoutAnchorable AvalonDock 2 中放置窗口实例

    我正在将 WPF C 应用程序 不是 MVVM 中的 AvalonDock 从 1 3 升级到 2 0 在 1 3 中 只要使用 DockableContent 我就可以放置自定义窗口 XAML
  • 如何使用 ctypes 将 Python 列表列表转换为 C 数组?

    正如这里所见如何使用 ctypes 将 Python 列表转换为 C 数组 此代码将获取一个 Python 数组并将其转换为 C 数组 import ctypes arr ctypes c int len pyarr pyarr 对于列表的
  • 使用 get_Keys() 方法进行集合是否正确

    与此问题相关 我可以将名为 keys 的键添加到哈希表而不覆盖 keys 成员吗 我实际上经常使用get Keys method作为推荐的PSBase property只会转移问题 换句话说 在解决方案如下的情况下 对于未知的目录键列表 此