呵呵乐 發表於 2024-2-3 16:32:00

delphi 里 多用TArray 而不是 array of

<p>今天写代码发现个bug,是delphi 编译器 核心层面的:</p>
<pre class="language-pascal highlighter-hljs"><code>unit ddx.att;

interface

uses System.Generics.Collections, System.Rtti;

type

xstring = string;

InstanceName = class(TCustomAttribute)
private
    Fvalue: array of string;
public
    constructor Create(AValue:array of string);
end;

implementation

constructor InstanceName.Create(AValue:array of string);
begin
inherited Create;
Fvalue := AValue;
end;</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/307031/202402/307031-20240203162818470-60629996.png"></p>
<p>新版本,以后 还是 多用 TArray作为 入参吧;</p>
<pre class="language-pascal highlighter-hljs"><code>unit ddx.att;

interface

uses System.Generics.Collections, System.Rtti;

type

xstring = string;

InstanceName = class(TCustomAttribute)
private
    Fvalue: TArray&lt;xstring&gt;;
public
    constructor Create(AValue: TArray&lt;xstring&gt;);
end;

implementation

constructor InstanceName.Create(AValue: TArray&lt;xstring&gt;);
begin
inherited Create;
Fvalue := AValue;
end;

end.</code></pre>
<p>&nbsp;</p>
<p>又做了一个测试 使用 Tarray和 array of 都可以 很好的 作为参数:</p>
<p><img src="https://img2024.cnblogs.com/blog/307031/202402/307031-20240203163019021-49416131.png"></p>
<p><img src="https://img2024.cnblogs.com/blog/307031/202402/307031-20240203163122175-103306322.png"></p>
<p>&nbsp;</p>
<p class="">在 Delphi 中,<code class=" inline">array of T</code>&nbsp;和&nbsp;<code class=" inline">TArray&lt;T&gt;</code>&nbsp;都用于表示动态数组,但它们之间存在一些关键区别,尤其是在类型安全性和使用方式上。</p>
<ol>
<li><strong><code class=" inline">array of T</code></strong>:
<ul>
<li>这是 Delphi 中传统的动态数组声明方式。</li>
<li>它不是类型安全的,因为你可以将一种类型的动态数组赋值给另一种类型的动态数组(尽管这通常是不安全的,并且可能导致运行时错误)。</li>
<li>使用&nbsp;<code class=" inline">SetLength</code>&nbsp;函数来分配和重新分配内存。</li>
<li>在较旧的 Delphi 版本中,这是创建动态数组的唯一方式。</li>
</ul>
</li>
<li><strong><code class=" inline">TArray&lt;T&gt;</code></strong>:
<ul>
<li><code class=" inline">TArray&lt;T&gt;</code>&nbsp;是 Delphi 引入泛型后提供的一个动态数组类型,其中&nbsp;<code class=" inline">T</code>&nbsp;是数组元素的类型。</li>
<li>它是类型安全的,因为泛型提供了编译时类型检查。这意味着你不能将&nbsp;<code class=" inline">TArray&lt;Integer&gt;</code>&nbsp;赋值给&nbsp;<code class=" inline">TArray&lt;String&gt;</code>,除非显式地进行类型转换(这通常是不可能的,因为它们表示完全不同的元素类型)。</li>
<li><code class=" inline">TArray&lt;T&gt;</code>&nbsp;通常与泛型集合类一起使用,提供了更好的代码重用和更强的类型安全性。</li>
<li>在内部,<code class=" inline">TArray&lt;T&gt;</code>&nbsp;实际上就是一个&nbsp;<code class=" inline">array of T</code>,但编译器为其提供了额外的类型检查和可能的优化。</li>
<li>你可以使用&nbsp;<code class=" inline">Length</code>&nbsp;函数来获取数组的长度,并且可以通过直接赋值来调整数组大小(这将自动调用&nbsp;<code class=" inline">SetLength</code>)。</li>
</ul>
</li>
</ol>
<p class=""><strong>使用建议</strong>:</p>
<ul>
<li>如果你正在使用较新的 Delphi 版本(尤其是支持泛型的版本),建议使用&nbsp;<code class=" inline">TArray&lt;T&gt;</code>,因为它提供了更好的类型安全性和更现代的编程风格。</li>
<li>如果你正在维护较旧的代码库或需要与不支持泛型的库互操作,则可能需要继续使用&nbsp;<code class=" inline">array of T</code>。</li>
</ul>
<p class=""><strong>示例</strong>:</p>
<p class="">使用&nbsp;<code class=" inline">array of T</code>:</p>
<pre class="highlighter-hljs">&nbsp;</pre>
<div class="code-header"><span class="code-lang">delphi</span><span class="code-copy"><span class="code-copy-text">复制代码</span></span></div>
<pre class="highlighter-hljs">&nbsp;</pre>
<div class="code-wrapper">
<table class="hljs hljs-ln">
<tbody>
<tr>
<td class="hljs-ln-line hljs-ln-numbers" data-line-number="1">
<div class="hljs-ln-n" data-line-number="1">&nbsp;</div>
</td>
<td class="hljs-ln-line hljs-ln-code" data-line-number="1"><span class="hljs-keyword">var</span></td>
</tr>
<tr>
<td class="hljs-ln-line hljs-ln-numbers" data-line-number="2">
<div class="hljs-ln-n" data-line-number="2">&nbsp;</div>
</td>
<td class="hljs-ln-line hljs-ln-code" data-line-number="2">Ints: <span class="hljs-keyword">array</span> <span class="hljs-keyword">of</span> Integer;</td>
</tr>
<tr>
<td class="hljs-ln-line hljs-ln-numbers" data-line-number="3">
<div class="hljs-ln-n" data-line-number="3">&nbsp;</div>
</td>
<td class="hljs-ln-line hljs-ln-code" data-line-number="3"><span class="hljs-keyword">begin</span></td>
</tr>
<tr>
<td class="hljs-ln-line hljs-ln-numbers" data-line-number="4">
<div class="hljs-ln-n" data-line-number="4">&nbsp;</div>
</td>
<td class="hljs-ln-line hljs-ln-code" data-line-number="4">SetLength(Ints, <span class="hljs-number">5</span>);</td>
</tr>
<tr>
<td class="hljs-ln-line hljs-ln-numbers" data-line-number="5">
<div class="hljs-ln-n" data-line-number="5">&nbsp;</div>
</td>
<td class="hljs-ln-line hljs-ln-code" data-line-number="5">Ints[<span class="hljs-number">0</span>] := <span class="hljs-number">10</span>;</td>
</tr>
<tr>
<td class="hljs-ln-line hljs-ln-numbers" data-line-number="6">
<div class="hljs-ln-n" data-line-number="6">&nbsp;</div>
</td>
<td class="hljs-ln-line hljs-ln-code" data-line-number="6"><span class="hljs-keyword">end</span>;</td>
</tr>
</tbody>
</table>
</div>
<pre class="highlighter-hljs">&nbsp;</pre>
<p class="">使用&nbsp;<code class=" inline">TArray&lt;T&gt;</code>:</p>
<pre class="highlighter-hljs">&nbsp;</pre>
<div class="code-header"><span class="code-lang">delphi</span><span class="code-copy"><span class="code-copy-text">复制代码</span></span></div>
<pre class="highlighter-hljs">&nbsp;</pre>
<div class="code-wrapper">
<table class="hljs hljs-ln">
<tbody>
<tr>
<td class="hljs-ln-line hljs-ln-numbers" data-line-number="1">
<div class="hljs-ln-n" data-line-number="1">&nbsp;</div>
</td>
<td class="hljs-ln-line hljs-ln-code" data-line-number="1"><span class="hljs-keyword">var</span></td>
</tr>
<tr>
<td class="hljs-ln-line hljs-ln-numbers" data-line-number="2">
<div class="hljs-ln-n" data-line-number="2">&nbsp;</div>
</td>
<td class="hljs-ln-line hljs-ln-code" data-line-number="2">Ints: TArray&lt;Integer&gt;;</td>
</tr>
<tr>
<td class="hljs-ln-line hljs-ln-numbers" data-line-number="3">
<div class="hljs-ln-n" data-line-number="3">&nbsp;</div>
</td>
<td class="hljs-ln-line hljs-ln-code" data-line-number="3"><span class="hljs-keyword">begin</span></td>
</tr>
<tr>
<td class="hljs-ln-line hljs-ln-numbers" data-line-number="4">
<div class="hljs-ln-n" data-line-number="4">&nbsp;</div>
</td>
<td class="hljs-ln-line hljs-ln-code" data-line-number="4">Ints := TArray&lt;Integer&gt;.Create(<span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">30</span>, <span class="hljs-number">40</span>, <span class="hljs-number">50</span>);</td>
</tr>
<tr>
<td class="hljs-ln-line hljs-ln-numbers" data-line-number="5">
<div class="hljs-ln-n" data-line-number="5">&nbsp;</div>
</td>
<td class="hljs-ln-line hljs-ln-code" data-line-number="5"><span class="hljs-comment">// 或者使用动态数组初始化器 </span></td>
</tr>
<tr>
<td class="hljs-ln-line hljs-ln-numbers" data-line-number="6">
<div class="hljs-ln-n" data-line-number="6">&nbsp;</div>
</td>
<td class="hljs-ln-line hljs-ln-code" data-line-number="6">Ints := [<span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">30</span>, <span class="hljs-number">40</span>, <span class="hljs-number">50</span>];</td>
</tr>
<tr>
<td class="hljs-ln-line hljs-ln-numbers" data-line-number="7">
<div class="hljs-ln-n" data-line-number="7">&nbsp;</div>
</td>
<td class="hljs-ln-line hljs-ln-code" data-line-number="7"><span class="hljs-keyword">end</span>;</td>
</tr>
</tbody>
</table>
</div>
<pre class="highlighter-hljs">&nbsp;</pre>
<p class="">注意:在上面的&nbsp;<code class=" inline">TArray&lt;T&gt;</code>&nbsp;示例中,我使用了动态数组初始化器,这是 Delphi 的一种语法糖,允许你更简洁地初始化动态数组。然而,这种初始化方式实际上在内部调用了&nbsp;<code class=" inline">SetLength</code>&nbsp;和逐个元素的赋值操作。</p>

</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:del88,转载请注明原文链接:https://www.cnblogs.com/del88/p/18004904</p><br><br>
来源:https://www.cnblogs.com/del88/p/18004904
頁: [1]
查看完整版本: delphi 里 多用TArray 而不是 array of