C# 带有 new 和 get 整数的构造函数

2024-03-18

这是 Unity 5.5.0 上的结构我对 C# 很陌生,不太了解属性和结构。

这会在分配期间出现错误this.X.

我假设您无法更改结构上的值,并且关键字 this 指的是结构的属性

在控制返回给调用者之前,必须完全分配自动实现的属性“Point.X”的支持字段。考虑从构造函数初始值设定项调用默认构造函数。 (CS0843) (装配-CSharp) [法律公告 15]

在将“this”对象的所有字段分配给 (CS0188) (Assembly-CSharp) [LN 16] 之前,不能使用“this”对象

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public struct Point 
{

    // Don't undertstand why "public int X, Y" works fine but not this        
    public int X { get; set; }

    public int Y { get; set; }

    //public int X,Y;

    public Point(int x, int y) 
    { 
        // LN 15
        this.X=x;
        this.Y=y;
    }
}

这是某些 C# 版本的奇怪之处;编译器有时无法正确检测到该结构已通过构造函数在所有代码路径上完全初始化。

解决方法是说

public Point(int x, int y) : this()  // default initialization
{ 
  this.X = x;
  this.Y = y;
}

它告诉编译器“这些字段在构造函数中初始化之前已初始化为其默认值”。

这是我们做 C# 3 时语言设计的一点失败;根本不清楚这是否是您必须做的。对于那个很抱歉。

既然我引起了您的注意,让我们解决您提出的另一点:

我假设您无法更改结构上的值

You can改变结构上的值,但是你不应该。结构应该是:

  • small
  • 逻辑值
  • 不可变的

所以我的建议是将设置器设置为私有 (with private set;)

你已经创建了一个可变的点结构,这是一个不好的做法。创建一个不可变的点结构,并将它们视为不可变的数学对象,而不是变量的集合。

Also:

关键字 this 指的是结构的属性

关键词this is an 保存结构实例值的变量的别名。这是微妙的;让我举一个例子。如果我们说:

Point a = new Point(1, 2);

这意味着:

  • 创建一个新的临时存储变量,其大小为一个点。
  • 调用双参数构造函数,使得this该临时存储变量的别名,并将 1 和 2 复制到形参 x 和 y 中。
  • 构造函数返回后,将临时变量中的值复制到变量中a.

现在,您可能会注意到,这样做似乎会更有效:

  • 调用双参数构造函数,使得this的别名a, 等等。

而且效率会更高;这就是所谓的复制省略优化C# 做到了当它知道用户不可能注意到差异时。 (挑战:构建一个 C# 程序,用户可以在其中确定是否使用复制省略;C# 将not在这样的程序中复制删除!)

同样,如果您随后这样做:

struct Point
{
   ... constructors, whatever ...
   public double DistanceFromOrigin()
   {
     return Math.Sqrt(this.X * this.X + this.Y * this.Y);
   }

你打电话时a.DistanceFromOrigin(), this成为别名a;他们是相同的变量只是有两个不同的名字。

This is not引用类型如何工作。在引用类型中,this is a copy of the 参考。在值类型中,this is an 变量的别名.

这些都是微妙的点。

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

C# 带有 new 和 get 整数的构造函数 的相关文章

  • 为什么这个 IA32 汇编代码有 3 个 leaal 指令?

    我编译了这个C函数 int calc int x int y int z return x 3 y 19 z 我在 calc s 中得到了这个 我正在注释正在发生的事情 file calc c text globl calc type ca
  • 如何获取网络服务的状态

    如何使用 C 获取 Web 服务的状态 无论是成功完成 失败还是待处理 private void button1 Click object sender EventArgs e var url servicsURL try var myRe
  • ExecuteNonQueryAsync 并在 SQL 事务中提交

    我正在寻求对我创建的一段代码的帮助 我正在尝试在事务中从 C 进行异步 SQL 调用 例如我可能正在更新或删除表中的行 这是我到目前为止所拥有的 但我似乎无法找到有关在事务中执行此操作的太多信息 根据我在这里所拥有的以及到目前为止我所理解的
  • 是否有任何替代方法来实现 WebRTC SFU,只有 1 个上传流?

    我有一个服务器 能够将 WebRTC 媒体数据从 A 中继到 B 对于视频会议 如果我们采用 P2P 方法 则会创建一个网状网络 当P2P不起作用的时候 我们就可以拥有这个中继服务器 主要问题是在网状网络中 对于N个参与者来说 上传链路的数
  • 嵌套绑定表达式

    这是一个后续问题我之前的问题 https stackoverflow com questions 2735294 templates function pointers and c0x include
  • C++ 构造函数根据参数类型调用另一个构造函数

    我有这门课 class XXX public XXX struct yyy XXX std string private struct xxx data 第一个构造函数 使用结构 很容易实现 第二 我可以将一个字符串以特定的格式分开 解析
  • 如何防止 Parallel.ForEach 循环在运行时更改任务数量?

    我正在使用Parallel ForEach循环做一些工作 我用localInit像这样 localInit gt new foo new Foo bars CreateBars 根据文档 https learn microsoft com
  • 值类型数组如何存储在 .NET 对象堆中?

    在 NET中 诸如int之类的值类型对象存储在内存中 引用类型对象需要为引用和对象单独分配内存 并且对象存储在 NET对象堆中 而Array是在堆中创建的 那么int 等值类型的数组如何存储在堆中呢 这是否意味着值类型对象可以存储在堆中而无
  • 如何更改控制台中的光标位置?

    我想用Console ReadLine 在上一行中并使其显示如下 HeresomeText gt input Not like HeresomeText gt input 可以做吗 使用 Write 方法而不是 WriteLine 方法 C
  • 使用 rhino 模拟进行 lambda 单元测试失败

    如果我有这个测试 Expect Call session Single
  • 更改 Json 中属性的键

    这些天我正在尝试制作一个 json 编辑器 与树视图一起使用 我确实更改了值函数 我也可以更改一些键 但我无法在对象中设置键 我可以设置值 SetValue ref JObject main JToken token JToken newV
  • 清除指针向量[重复]

    这个问题在这里已经有答案了 假设我定义了一个这样的类 class foo private std vector lt int gt v public void bar1 for int i 0 i lt 10 i int a new int
  • C++ 访问嵌套类的私有成员

    标题可能有点误导 我有以下问题 我有一棵由叶子和内部节点组成的树 用户应该能够在叶子中存储任何信息and该树有一些方法可以获取一组用户定义的值 并且需要在恒定时间内 未摊销 访问相应的叶子 我提出了以下想法 但它不起作用 因为不幸的是我无法
  • “双免”是什么意思?

    正如标题所暗示的那样 我是 C 语言的新手 并且很快就会有期中考试 我目前正在修改过去的论文 一个反复出现的主题是双重自由问题 我理解就是调用的过程free 在同一个内存位置两次 但我有几个问题我不能 100 确定如何回答 问题1 C中双重
  • “未定义对 clrscr() 的引用;” [复制]

    这个问题在这里已经有答案了 include
  • 使用 C# 在 XML 文档中查找特定值的好方法是什么?

    我正在调用 Oracle 公开的 WebService 它接受 ItemID 的输入并向我返回相应的 Item Number 我想获取从响应中包含的 XML 返回的项目编号 XML 看起来像这样
  • WiX 安装程序在 vs 2012 上不起作用

    我想为我的应用程序创建一个安装程序 我已经下载了 WiX 3 6 并将其安装在 vs 2012 上 创建简单的winform应用程序 将 WiX 安装项目添加到我的解决方案中 右键单击参考并将我的 winform 应用程序添加到安装程序的参
  • 成员函数的Decltype

    class A int f int x int j return 2 decltype f p 给我错误 error decltype cannot resolve address of overloaded function 我不明白为什
  • Cmake:在自定义目录中查找 protobuf 包

    我有 cmake 3 10 x 并下载了当前的 protobuf 源 3 6 1 使用 cmake 我创建了 bin 目录 PROTOBUF SOURCE DIR bin 在其中成功构建了该库 下一步我想在我的基于 cmake 的项目中使用
  • SQlite 查询 - 如何检索多列数据?

    我很难在网上找到一个关于使用 xcode 和 cocos2dx 从 SQlite DB 获取多个值的工作示例 这是我的sql查询 char sql query 100 sprintf sql query SELECT FROM SQList

随机推荐

  • PyDev 不执行将当前行发送到控制台的快捷方式

    According to this question https stackoverflow com questions 24380281 liclipse and execute codes in console shortcuts an
  • 是否可以生成动态sql来返回雪花中具有各种列的行

    我们将各种数据作为值 对存储在 JSON 列中 所有行的对名称都不相同 并且取决于某些元数据 有没有办法编写一个 SQL 语句来根据某些元数据检索其中一些值对 类似动态生成的东西 SELECT MyJson FruitShape MyJso
  • nextjs 预渲染所有页面还是仅预渲染第一页?

    我正在学习 nextjs 并在某些地方读到 nextjs 仅预渲染第一页 而在其他一些地方他们说 nextjs 默认情况下预渲染所有页面 所以我无法理解哪一个是正确的 有不同的渲染策略 您可以通过在页面文件中添加方法来选择 Next Js
  • 如何确定 SSIS 数据集中的行数

    我经常在 SSIS 包中遇到这样的情况 运行 SQL 命令从 ADO 连接返回一组行 在某些情况下 我想根据返回的行数进行分支 ado 结果集存储在 SSIS 对象 数据类型中 SSIS 表达式或脚本组件中有没有办法获取行数 不要使用执行
  • Playframework 进化文件与 postgres 和 h2 兼容

    我一直在使用 H2 作为后端 使用 Play 框架 scala 开发一个网站 测试集成得很好 尤其是能够针对内存中的 H2 数据库运行测试 现在 出于各种方便的原因 我想将我的数据存储转移到 Postgres 这给我留下了一个问题 如何继续
  • 如何从命令行调用带参数的 mysql 存储过程?

    如何从命令行调用存储过程 我有一个程序 CREATE DEFINER root localhost PROCEDURE insertEvent IN dateTimeIN DATETIME NO SQL BEGIN SET eventIDO
  • 为什么我在使用 Ionic Framework 插件 healthkit 时收到错误plugin_not_installed?

    我已经使用 Ionic Framework 一段时间了 但最近遇到了这个错误plugin not installed对于 Health Kit 插件 我知道我有基于我的ionic cordova plugin list output ion
  • 批量插入时如何自动截断字符串?

    我想将许多行 从实体框架对象构造 插入到 SQL Server 问题是 某些字符串属性的长度超过了数据库中列的长度 这会导致异常 然后所有行将无法插入到数据库中 所以我想知道是否有办法告诉 SqlBulkCopy 自动截断任何超长的行 当然
  • 使用加法、减法和减半计算三角根

    特定游戏的规则是角色的力量与角色的力量成正比 三角根 https math stackexchange com q 698961 93170角色的经历 例如 15 20经验获得5力量 21 27经验获得6力量 28 35经验获得7力量等等
  • UIWebView 以更有效的方式减少加载时间

    我正在下载多个 html 并将它们作为字符串保存在本地NSArray 然后我用3UIWebViews加载内容 用户总是看到一个UIWebView还有 2 个UIWebViews使用以下方式在后台加载 firstWebView loadHTM
  • 将属性添加到 php 中对象顶部的 stdClass

    当创建一个对象时php用于返回 JSON 是否可以添加一个属性并强制它位于顶部 我想要这个 因为该对象是通过 API 公开的 并且最好在顶部有 id 例如 obj new stdClass obj gt name John obj gt a
  • 如何在 C++ 中限制生成的程序可以使用的内存量

    在我的 C 程序中 我将启动其他程序 如果这些程序使用超过一定量的内存 我希望我的程序杀死它们的进程 那怎么办呢 我可能会使用 execv 来启动程序 假设您使用的是 POSIX 系统 您可以通过调用来限制这一点setrlimit 2 af
  • Linux 上的 .NET core X509Store

    使用 NET Core 2时 Linux中的证书文件位于哪里X509Store 在 Windows 上 可以从管理控制台访问证书certlm msc或与New SelfSignedCertificate在 powershell 中 使用 N
  • 为什么 Xcode 6 将动态链接编辑器库中的自动完成功能保持为 TRUE?

    我仍在学习 Swift 和 iOS 开发 但我一直遇到这个问题 尽管我尝试深入了解一下 但我仍然有点困惑 当我开始打字时trueXcode 6 建议自动完成TRUE 不是世界末日 然而 有一次我决定看看如果我使用会发生什么TRUE结果给了我
  • Spring尤里卡中的instanceid是什么?

    我读到 Eureka 客户端的实例 ID 必须是唯一的 当我们希望运行同一 Eureka 客户端的多个实例时 我们添加此属性 eureka instance instance id spring cloud client hostname
  • 如何依次请求多个权限?

    我的应用程序需要访问CAMERA and 写外部存储权限 一旦我的应用程序加载 我想要求用户依次允许这两个权限 我有这个代码 if ContextCompat checkSelfPermission this Manifest permis
  • 如何仅提取 .tar.gz 成员的文件?

    我的目标是打开包装 tar gz文件 而不是指向该文件的子目录 我的代码基于此question https stackoverflow com questions 4917284 extract files from zip without
  • 图论。如何处理此类问题?我想知道解决这个问题时的逻辑和思考方式。

    求笛卡尔平面上从 0 0 到 n n 的路径数 该路径永远不会高于 y x 线 可以沿着路径进行三种类型的移动 move up i e from i j to i j 1 move to the right i e from i j to
  • Lua中字符串的串联

    在许多语言中 您可以在变量赋值时连接字符串 我有一个使用 Lua 编程语言的场景 我需要将命令的输出附加到现有变量 Lua 中是否有与以下示例等效的功能 其他语言的例子 PERL filename checkbook filename tm
  • C# 带有 new 和 get 整数的构造函数

    这是 Unity 5 5 0 上的结构我对 C 很陌生 不太了解属性和结构 这会在分配期间出现错误this X 我假设您无法更改结构上的值 并且关键字 this 指的是结构的属性 在控制返回给调用者之前 必须完全分配自动实现的属性 Poin