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<xstring>;
public
constructor Create(AValue: TArray<xstring>);
end;
implementation
constructor InstanceName.Create(AValue: TArray<xstring>);
begin
inherited Create;
Fvalue := AValue;
end;
end.</code></pre>
<p> </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> </p>
<p class="">在 Delphi 中,<code class=" inline">array of T</code> 和 <code class=" inline">TArray<T></code> 都用于表示动态数组,但它们之间存在一些关键区别,尤其是在类型安全性和使用方式上。</p>
<ol>
<li><strong><code class=" inline">array of T</code></strong>:
<ul>
<li>这是 Delphi 中传统的动态数组声明方式。</li>
<li>它不是类型安全的,因为你可以将一种类型的动态数组赋值给另一种类型的动态数组(尽管这通常是不安全的,并且可能导致运行时错误)。</li>
<li>使用 <code class=" inline">SetLength</code> 函数来分配和重新分配内存。</li>
<li>在较旧的 Delphi 版本中,这是创建动态数组的唯一方式。</li>
</ul>
</li>
<li><strong><code class=" inline">TArray<T></code></strong>:
<ul>
<li><code class=" inline">TArray<T></code> 是 Delphi 引入泛型后提供的一个动态数组类型,其中 <code class=" inline">T</code> 是数组元素的类型。</li>
<li>它是类型安全的,因为泛型提供了编译时类型检查。这意味着你不能将 <code class=" inline">TArray<Integer></code> 赋值给 <code class=" inline">TArray<String></code>,除非显式地进行类型转换(这通常是不可能的,因为它们表示完全不同的元素类型)。</li>
<li><code class=" inline">TArray<T></code> 通常与泛型集合类一起使用,提供了更好的代码重用和更强的类型安全性。</li>
<li>在内部,<code class=" inline">TArray<T></code> 实际上就是一个 <code class=" inline">array of T</code>,但编译器为其提供了额外的类型检查和可能的优化。</li>
<li>你可以使用 <code class=" inline">Length</code> 函数来获取数组的长度,并且可以通过直接赋值来调整数组大小(这将自动调用 <code class=" inline">SetLength</code>)。</li>
</ul>
</li>
</ol>
<p class=""><strong>使用建议</strong>:</p>
<ul>
<li>如果你正在使用较新的 Delphi 版本(尤其是支持泛型的版本),建议使用 <code class=" inline">TArray<T></code>,因为它提供了更好的类型安全性和更现代的编程风格。</li>
<li>如果你正在维护较旧的代码库或需要与不支持泛型的库互操作,则可能需要继续使用 <code class=" inline">array of T</code>。</li>
</ul>
<p class=""><strong>示例</strong>:</p>
<p class="">使用 <code class=" inline">array of T</code>:</p>
<pre class="highlighter-hljs"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </pre>
<p class="">使用 <code class=" inline">TArray<T></code>:</p>
<pre class="highlighter-hljs"> </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"> </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"> </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"> </div>
</td>
<td class="hljs-ln-line hljs-ln-code" data-line-number="2">Ints: TArray<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"> </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"> </div>
</td>
<td class="hljs-ln-line hljs-ln-code" data-line-number="4">Ints := TArray<Integer>.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"> </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"> </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"> </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"> </pre>
<p class="">注意:在上面的 <code class=" inline">TArray<T></code> 示例中,我使用了动态数组初始化器,这是 Delphi 的一种语法糖,允许你更简洁地初始化动态数组。然而,这种初始化方式实际上在内部调用了 <code class=" inline">SetLength</code> 和逐个元素的赋值操作。</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]