我有一个这样设置的记录:
let myRecord = Record<String, Set<String>>
如何将元素添加到记录内的集合中?我尝试了以下方法但没有成功:
let key = "key";
let stringToAdd = "stringToAdd";
myRecord[key].add(stringToAdd);
Run Code Online (Sandbox Code Playgroud) C# 9 终于添加了记录!我等了很久了,太棒了!但我想知道记录的意义{ get; set; }是什么?看起来记录应该是不可变的并用于{ get; init; }其所有属性。也许我太习惯使用不可变数据,但我不明白可变记录的意义。看起来它只是增加了代码中出现错误的可能性。我是否错过了一个非常明显且有用的用例?
我很想知道为什么Delphi将记录类型属性视为只读:
TRec = record
A : integer;
B : string;
end;
TForm1 = class(TForm)
private
FRec : TRec;
public
procedure DoSomething(ARec: TRec);
property Rec : TRec read FRec write FRec;
end;
Run Code Online (Sandbox Code Playgroud)
如果我尝试为Rec属性的任何成员赋值,我将得到"左侧无法分配"错误:
procedure TForm1.DoSomething(ARec: TRec);
begin
Rec.A := ARec.A;
end;
Run Code Online (Sandbox Code Playgroud)
允许对底层字段执行相同操作:
procedure TForm1.DoSomething(ARec: TRec);
begin
FRec.A := ARec.A;
end;
Run Code Online (Sandbox Code Playgroud)
这种行为有什么解释吗?
我目前正计划将我的"手动查询编写"代码切换到一个不错的SQL框架,因此我可以将查询或sql内容留给框架,而不是自己编写查询.
现在我想知道如何从Entity Framework 4中的表中获取单条记录?
我主要使用SQL SELECT * FROM {0} WHERE Id = {1}.就我而言,这在EF4中不起作用.
有没有办法可以从我的上下文中选择一个基于ID的记录?
就像是:
public Address GetAddress(int addressId)
{
var result = from Context.Addresses where Address.Id = addressId;
Address adr = result as Address;
return Address;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我已经使用Delphi很长一段时间了,但是我没有从CS背景中学到"在工作中" - 主要来自我的Boss,并且通过网络上的点点滴滴,用户指南,示例进行了扩充.等
现在我的老板是老学校,开始使用Pascal进行编程,并且不一定了解最新的Delphi更新.
就在最近,我一直想知道我们的核心技术是否"错误".
我们的大多数应用程序都与MySQL连接.一般来说,我们将创建一个record带有结构来存储从DB读取的数据,并将这些记录存储在一个TList.通常,我们将有一个单元,用于定义应用程序中的各种记录,以及种子和读取记录的功能和过程.我们不使用此处概述的记录程序
在回顾了一些例子之后,我开始想知道我们是否会更好地使用classes而不是记录,但无论如何我都难以找到强有力的指导.
我们正在处理的事情是用户信息:名称,DOB,事件,事件类型.或时间表信息:小时,工作等...
你好,
\nI\xc2\xb4m 尝试discriminated union type在 C# 中重建 a 。
\n我总是用这样的类创建它们:
public abstract class Result\n{\n private Result() { }\n\n public sealed class Ok : Result\n {\n public Ok(object result) // don\xc2\xb4t worry about object - it\xc2\xb4s a sample\n => Result = result;\n \n public object Result { get; }\n }\n\n public sealed class Error : Result\n {\n public Error(string message)\n => Message = message;\n\n public string Message { get; }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n问题是,与以下内容相比,样板代码太多了F#:
type …Run Code Online (Sandbox Code Playgroud) 如果我有一个包含 2 个属性的 Java 记录,并且我想为应该使用的属性定义默认值,而不是 null。我可以重写吸气剂:
\npublic record MyRecord(Set<String> strings, Boolean required) {\n\n @Override\n public Boolean required() {\n return Objects.requireNonNullElse(this.required, Boolean.TRUE);\n }\n\n @Override\n public Set<String> strings() {\n return Objects.requireNonNullElse(this.strings, Set.of());\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x80\xa6or 我可以通过覆盖默认构造函数来实现同样的效果:
\npublic record MyRecord(Set<String> strings, Boolean required) {\n\n public MyRecord(Set<String> strings, Boolean required) {\n this.strings = Objects.requireNonNullElse(strings, Set.of());\n this.required = Objects.requireNonNullElse(required, Boolean.TRUE);\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n这两个看起来都有点冗长,有没有更简洁的方法来为记录属性分配默认值?
\nF#可以很容易地定义类型
type coords = { X : float; Y : float }
Run Code Online (Sandbox Code Playgroud)
但是如何在不进入更详细的类定义语法的情况下为构造函数定义约束/检查参数?例如,如果我想从(0,0)开始coords或抛出异常.
此外,如果我将我的定义更改为类,我需要实现Equals()等所有我不想要的样板代码(以及我在C#中试图摆脱的那些).
的C#9的记录功能规范包括以下内容:
一个记录类型包含两个复制成员:
采用记录类型的单个参数的构造函数。它被称为“复制构造函数”。具有编译器保留名称的合成公共无参数实例“克隆”方法
但我似乎无法调用这两个复制成员中的任何一个:
public record R(int A);
// ...
var r2 = new R(r); // ERROR: inaccessible due to protection level
var r3 = r.Clone(); // ERROR: R does not contain a definition for Clone
Run Code Online (Sandbox Code Playgroud)
由此,我了解到构造函数是受保护的,因此无法在记录的继承层次结构之外访问。所以我们只剩下这样的代码:
var r4 = r with { };
Run Code Online (Sandbox Code Playgroud)
但是克隆呢?根据上述规范,克隆方法是公开的。但它的名字是什么?或者它是一个有效的随机字符串,因此不应在记录的继承层次结构之外调用它?如果是这样,深复制记录的正确方法是什么?从规范看来,人们可以创建自己的克隆方法。是这样吗,它应该如何工作的一个例子是什么?
我正在寻找获得Delphi记录中字段偏移的方法.以下两种方法有效,但我希望有一种更清洁的方式.基本上我会喜欢第三个showmessage工作.有任何想法吗?
type
rec_a=record
a:longint;
b:byte;
c:pointer;
end;
{$warnings off}
function get_ofs1:longint;
var
abc:^rec_a;
begin
result:=longint(@abc.c)-longint(abc);
end;
{$warnings on}
function get_ofs2:longint;
asm
mov eax,offset rec_a.c
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(inttostr(get_ofs1));
showmessage(inttostr(get_ofs2));
// showmessage(inttostr(longint(addr(rec_a.c)))); // is there a way to make this one work?
end;
Run Code Online (Sandbox Code Playgroud)
编辑:好的,下面的答案很好,谢谢!作为参考,这里是各种选项的汇编输出:
---- result:=longint(@abc.c)-longint(abc); ----
lea edx,[eax+$08]
sub edx,eax
mov eax,edx
---- mov eax,offset rec_a.c ----
mov eax,$00000008
---- result:=longint(@rec_a(nil^).c); ----
xor eax,eax
add eax,$08
Run Code Online (Sandbox Code Playgroud)
edit2:看起来这是前一个问题的重复:RRUZ下面提到的类似问题.如图所示,另一种方法是声明一个全局变量并按如下方式使用它.奇怪的是,编译器仍然无法在编译时分配正确的值,如汇编器输出中所示,因此为了效率和可读性,最好使用nil方法.
---- var ----
---- rec_a_ofs:rec_a; ----
---- ... ---- …Run Code Online (Sandbox Code Playgroud)