C# 引用数组

2023-12-22

我怎样才能做这样的事情?

int v1 = 4;
int v2 = 3;
int v3 = 2;
int v4 = 1;

int [] vars = new int [] {ref v1, ref v2, ref v3, ref v4};

for (var i = 0; i < 4; i++) {
    ChangeVar (vars [i], i);
}

void ChangeVar (ref int thatVar, int newValue) {
    thatVar = newValue;
}

Edit:

我想这样做是因为这些变量是由其他类直接访问的。例如 v1 可以是某物的宽度,v2 可以是某物的高度。我的一些类使用宽度变量来限制它必须从用户那里获得的输入的长度。有些类使用 height 变量来做其他事情。但我希望能够使用循环编辑这些变量,因为现在编辑过程是这样工作的:

int indexOfVarToChange = GetIndex ();

switch (indexOfVarToChange) {
    case 0:
        int newValue = GetNewValue ();
        width = newValue;
        break;
    case 1:
        int newValue = GetNewValue ();
        height = newValue;
        break;
}

我必须手动重新分配变量,因为我无法在循环中使用对这些变量的引用数组。我有超过 30 个独特的变量,我必须这样做,这很痛苦。

我想后备计划是将所有这些变量移到字典中,并拥有所有键的数组,并将每个键传递给编辑函数。


你不能。

您仍然可以就地编辑元素,但只能直接分配给它们:

 vars[2] += 42;

但我刚刚测试了这个作品:

using System;
public class Test
{
        private static void assign(ref int i)
        {
             i = 42;
        }

        public static void Main()
        {
              var vars = new [] { 1,2,3,4 };
              Console.WriteLine(vars[2]);
              assign(ref vars[2]);
              Console.WriteLine(vars[2]);
        }
}

See it 直播 http://ideone.com/fz36y http://ideone.com/fz36y

Output

3
42

更新:包装器

作为一种心理练习,我想出了这种病态和扭曲的机制来仍然得到你想要的东西(但比简单地装箱所有整数的成本更高):

private class Wrap<T> where T : struct
{
    public T Value;

    public static implicit operator Wrap<T>(T v) { return new Wrap<T> { Value = v }; }
    public static implicit operator T(Wrap<T> w) { return w.Value; }

    public override string ToString() { return Value.ToString(); }
    public override int GetHashCode() { return Value.GetHashCode(); }
    // TODO other delegating operators/overloads
}

Now, a Wrap<int>其行为大致与常规 int 相同(在比较、相等和运算符领域需要更多工作)。您可以使用它来编写此内容,并让它按照您想要的方式工作:

private static void assign(ref int i)
{
    i = 42;
}

public static void Main()
{
    Wrap<int> element = 7;
    var vars = new Wrap<int>[] {1, 2, element, 3, 4};
    Console.WriteLine(vars[2]);
    assign(ref vars[2].Value);
    Console.WriteLine(element);

    Console.ReadKey();
}

Output:

7
42

See it 也直播:http://ideone.com/b0m7T http://ideone.com/b0m7T

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

C# 引用数组 的相关文章

  • 根据当前文化调用不同(本地化)视图

    我在用着LocalizationAttribute它实现了ActionFilterAttribute本地化视图 我简单地说 Localize 在控制器上 我使用 LocalizeStrings resx 文件根据当前线程上的语言进行应用 一
  • 以编程方式更改 Excel 中的字体(Trebuchet MS、Calibari)C#

    我目前正在使用一个 C 应用程序 该应用程序有一个将生成 Excel 文件的类 一切都很顺利 Excel 工作表上填充的数据具有 Times New Roman 字体 我想将其更改为其他字体 Calibari 我怎样才能以编程方式做到这一点
  • 外部剃刀视图看不到外部模型

    我对外部剃刀视图有疑问 在我的项目中 我有主 mvc Web 程序集和动态加载的外部类库程序集 来自 DB 及其自己的控制器 视图和模型 这些程序集在运行时不会直接引用和加载 我能够通过为控制器创建自定义控制器工厂 为视图创建自定义虚拟路径
  • 用 C# 中的字典中的值替换字符串中的单词

    我有一个简单的dictionary像这样 var fruitDictionary new Dictionary
  • 多态性中基类缺少虚拟析构函数 = 资源泄漏?

    我们知道 如果要多态地使用基类 则需要将基类的析构函数指定为 virtual 否则程序中可能会出现资源泄漏 因为只会调用基类析构函数 而不会调用派生对象析构函数 我们还知道构造函数 析构函数纯粹是初始化 未初始化构造 而operator n
  • 错误 C2065:'cout':未声明的标识符

    我正在处理我的编程作业的 驱动程序 部分 但我不断收到这个荒谬的错误 错误 C2065 cout 未声明的标识符 我什至尝试过使用std cout但我收到另一个错误 IntelliSense 命名空间 std 没有成员 cout 当我宣布u
  • 如何将 QSerialPort 模块添加到 CMake 中?

    我想将 QSerialPort 模块添加到 CMake 中 根据我的理解 我需要将QT 串口添加到 pro中 我只想使用 CMake 所以我尝试编译简单的 CMake 文件 但有错误 QtCore 正在工作 qDebug 可以毫无问题地显示
  • ObjectTrackingEnabled 和 linq-to-sql

    I read here http www sidarok com web blog content 2008 05 02 10 tips to improve your linq to sql application performance
  • MVVM 同步集合

    是否有一种标准化方法可以将 Model 对象集合与 C 和 WPF 中匹配的 ModelView 对象集合同步 我正在寻找某种类 可以使以下两个集合保持同步 假设我只有几个苹果 并且可以将它们全部保存在内存中 换句话说 我想确保如果我将 A
  • 用于 C/C++ 的独立跨平台 (Windows/Linux) 文件压缩?

    我正在寻找一个 最好是小的 C 或 C 开源库 我可以将其包含在我的 MIT 许可项目中 托管在 google 代码上 我是一名业余爱好 C C 程序员 所以我并不那么先进 但我只知道为名为 SA MP 的应用程序 适用于 Windows
  • 如果 .txt 文件不存在,则创建一个,如果存在则追加新行

    我想创建一个 txt 文件并写入它 如果该文件已经存在 我只想添加更多行 string path E AppServ Example txt if File Exists path File Create path TextWriter t
  • ASP.NET 中的 thread.sleep

    我正在为我的网站模拟彗星实时馈送协议 因此在我的控制器中我添加 while nothing new before timeout Thread Sleep 1000 但我注意到添加此功能后整个网站变慢了 调试后我得出结论 当我打电话时Thr
  • Visual Basic 中未知长度的数组

    我有一段用 Visual Basic 编写的代码 Dim n As Double i As Integer n 4 Dim Ramp length 1 To 4 As Double For i 1 To n Ramp length i Ce
  • Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

    这个问题与 NET和OpenXml有关 我已经阅读了以下文章 它有很好的解释 但没有回答我的问题 Excel 2007 中数值的可视化与底层 xml 文件不一致 https stackoverflow com questions 58594
  • OpenMP 循环数组访问中的错误共享

    我想利用 OpenMP 来并行执行我的任务 我需要将数组的所有元素减去相同的数量并将结果写入另一个向量中 两个数组都是动态分配的malloc第一个填充了文件中的值 每个元素都有类型uint64 t pragma omp parallel f
  • 为什么 ASP.Net MVC Range 属性采用类型?

    我只是想知道为什么范围验证属性可以采用类型和两个字符串作为参数 这是为了根据枚举或类似的东西验证字符串吗 另外 我想做的是找到一种简单的方法来验证必须出现在枚举中的 3 个字符的字符串 有什么建议吗 谢谢 亚历克斯 我确实发现你提到的 Ra
  • 如何进行平衡组捕获?

    假设我有这个文本输入 tes tR R abc aD mnoR xyz 我想提取 ff 输出 R abc R xyz D mnoR xyz R R abc aD mnoR xyz 目前 我只能使用平衡组方法提取组内的内容 如中所示msdn
  • 是否可以在 Eclipse 中为除 Java 之外的 Eclipse 编写插件?

    谁能帮我用c 写一个eclipse插件 weekens 和 celavek 感谢您提供的信息 我正在研究 JNI 并将尝试实现它 celavek 我们必须做什么样的主控 控制 在C 和java接口中处理是否风险更大 我的要求是在 Java
  • 具有可导出私钥的证书的“错误密钥”例外

    我正在尝试使用非对称加密来加密然后解密文件 我已经使用 makecert 创建了一个测试证书并将其安装到我的个人本地计算机存储中 将来我必须在多个服务器上安装此证书 这就是为什么我使用 pe 标志创建它 即使用可导出的私钥 证书已成功创建并
  • 从不同的线程访问对象

    我有一个服务器类 它基本上等待来自客户端的连接 在该类中 我创建了一个 NetworkStream 对象 以便能够从客户端接收字节 由于 NetworkStream Read 方法不是异步的 这意味着它将等到从客户端读取字节才能继续执行类似

随机推荐

  • 当Service被杀死后,进程还能存活吗?

    我的应用程序同时具有服务和活动 假设我的应用程序的进程正在运行 一段时间后 Android 操作系统由于内存不足而终止了我的应用程序中的服务 我的问题是 Android是否有可能只杀死服务并保持进程处于活动状态 或者当一个服务被杀死时 该进
  • 使用jq递归提取对象值和父键名称

    我需要解析的输出npm ls global json命令 这样我就可以获得所有已安装的列表npm包的格式如下 package version js resolved Where package是包含包名称的键 来自每个dependencie
  • 将 Devise 与同一模型的多个命名空间一起使用

    我想将 Devise 与两个命名空间一起使用 API 命名空间和默认命名空间 但当用户尝试登录时 两者似乎发生冲突 含义是 无论引用 Devise 的哪个命名空间首先结束 是最终的重定向地点 例如 如果我尝试创建一个新会话 在默认命名空间下
  • TButton 的下拉菜单

    我正在尝试模拟 TButton 的下拉菜单 如下所示 procedure DropMenuDown Control TControl PopupMenu TPopupMenu var APoint TPoint begin APoint C
  • 如何将 Vuex mapGetters 与 Vue 3 SFC 脚本设置语法结合使用?

    我正在将组件从常规 Vue 3 Composition API 重构为脚本设置语法 初始点 Current Vue v3 迁移文档 https v3 migration vuejs org breaking changes i
  • 如何在 Watir 中屏蔽图像?

    我在用Watir http watir github io 对于不需要加载任何图像的数据获取工作 有可能阻止他们吗 我认为可以是 profile Selenium WebDriver Chrome Profile new profile w
  • 泛型如何影响 C# 和 .NET 的设计?

    这可能是一个广泛的问题 但这是我不太清楚并且很好奇的问题 很多时候 对于某些问题 我听到的理由是 这是因为泛型在 NET 1 0 中不可用 这让我想到以下两件事 以前没有想到泛型 因此开发人员在 NET 1 0 之后提出了它 这可能会极大地
  • 使用 iPhone 时网站出现水平滚动

    我的网站的移动版本有问题http dsmedvednikov2 zzz com ua http dsmedvednikov2 zzz com ua 使用 iPhone 或 iPad 时 无论使用 Safari 还是 Google Chrom
  • 计算管道分隔文件中的列数

    我有一根管子 分隔文件 File 106232145 medicare medicare medicaid 789 我想计算每行中的字段数 我尝试了下面的代码 Code awk F print NF 1 这返回的结果为 5 而不是 4 这是
  • 为什么不支持连接 std::string 和 std::string_view?

    从 C 17 开始 我们有std string view http en cppreference com w cpp string basic string view 连续字符序列的轻量级视图 可避免不必要的数据复制 而不是有一个cons
  • 如何在 .NET 中下载大文件(通过 HTTP)?

    我需要下载一个large在 C 控制台应用程序中通过 HTTP 创建文件 2 GB 问题是 大约 1 2 GB 后 应用程序内存不足 这是我正在使用的代码 WebClient request new WebClient request Cr
  • 如何使用正则表达式捕获嵌套的 {% if ... %}{% endif %} 语句

    这就是我现在得到的 if endif gusi 它可以很好地捕获多个 if 语句等 IMG http image xesau eu 2015 02 07 23 22 11 png http image xesau eu 2015 02 07
  • Type.GetConstructor 在 Iphone 上返回 null

    我正在 Xamarin 中为 Iphone 开发一个应用程序 类似应用程序的 Android 版本已准备好用于 Google Play 我在我的应用程序中使用 jabber net 库来实现聊天功能 但设备上出现一些问题 Iphone 5
  • AWS Elastic Beanstalk 上的 Spring Boot / Tomcat 仅显示 404 页面

    我有一个 Spring Boot 应用程序 可以在 Tomcat 下的本地主机上正常运行 当我将其打包为 WAR 并将其部署到 Elastic Beanstalk 上时 我只得到 404 页面 我尝试了许多不同的调整来尝试让它发挥作用 但我
  • Android 上监听通知

    关于android编程的通知 我有一些疑问 我已经阅读了 notificationmanager notification 和 notificationbuilder 但它似乎不允许它监听通知 我想做的是 当任何应用程序发送通知时 我将能够
  • 是什么可能导致明显的 nuget 包自引用?

    我有一个项目文件定位net 472 它依赖于一堆构建的库netstandard2 其中一些库依赖于Microsoft Extensions Primitives尽管 据我所知 库与根项目没有直接依赖关系 当我构建它时 我看到这个警告 Sev
  • 为什么 PHP 的空合并运算符 (??) 不能处理具有不同可见性的类常量?

    考虑下面的例子 A类有private const SOMETHING 但是 b 类有protected const SOMETHING class a private const SOMETHING This is a public sta
  • 如何在 solr 中索引单词及其前缀?

    我使用 solr 3 3 来索引我的文件 我想要 solr 索引词及其后缀 例如我想索引彩色 如颜色 当我搜索颜色 solr 时显示任何具有彩色的文档 您需要在现场应用分析 Stemming http wiki apache org sol
  • jquery逐字符显示字符串

    我想创建一个 jquery 脚本 它可以在 div 中逐个字符地写下字符串 就好像有人在用户查看页面时键入它一样 我认为这可以与使用 settimeout 的递归函数一起使用 请帮我解决这个问题 谢谢 你可以自己写一个 利用setInter
  • C# 引用数组

    我怎样才能做这样的事情 int v1 4 int v2 3 int v3 2 int v4 1 int vars new int ref v1 ref v2 ref v3 ref v4 for var i 0 i lt 4 i Change