---
title: Message `mode`
description: 消息以结构 SendParameters 的模式参数发送。 它是一个 Int 值，由基本模式和可选标记（也是 Int 值）组合而成
---

import { Badge } from '@astrojs/starlight/components';

如前所述，消息是通过结构体 `SendParameters{:tact}` 的 `mode` 参数发送的。 这是一个[`Int{:tact}`][int]值，由基本模式和可选标志组合而成，这些也是[`Int{:tact}`][int]值。

您可以使用原始的 [`Int{:tact}`][int]值，并手动为 `mode` 提供这些值，但为了方便起见，您可以使用一组常量来轻松构建复合 `mode`。有关基本模式和可选标记的更多消息，请参阅下表。 有关基本模式和可选标记的更多消息，请参阅下表。

## 基本模式 {#base-modes}

|         模式值 | 常量名称                                                                  | 说明                           |
| ----------: | :-------------------------------------------------------------------- | ---------------------------- |
| $0$C        | <Badge text="Since Tact 1.6" variant="tip"/> `SendDefaultMode{:tact}` | 普通消息（默认）。                    |
|  $64$       | `SendRemainingValue{:tact}`                                           | 除了新信息中最初显示的值外，还携带所有入站信息的剩余值. |
|  $128$      | `SendRemainingBalance{:tact}`                                         | 携带当前智能合约的所有余额，而不是消息中最初显示的值。  |

## 可选标记 {#optional-flags}

|        标志值 | 常量名称                            | 说明                                                                     |
| ---------: | :---------------------------------- | ---------------------------------------------------------------------- |
| $+1$       | ~~`SendPayGasSeparately{:tact}`~~   | 将转发费用与消息价值分开支付。                                                        |
| $+1$       | `SendPayFwdFeesSeparately{:tact}`   | 自 Tact 1.6.5 起已弃用 将转发费用与消息价值分开支付。                                                        |
| $+2$       | `SendIgnoreErrors{:tact}`           | 忽略行动阶段处理该消息时出现的任何错误。                                                   |
| $+16$      | `SendBounceIfActionFail{:tact}`     | 如果在行动阶段出现任何错误，则退回交易。 如果使用了标志 $+2$, `SendIgnoreErrors{:tact}`，则没有影响。    |
| $+32$      | `SendDestroyIfZero{:tact}`          | 如果当前账户的余额为零，则必须销毁该账户（通常与模式 $128$, `SendRemainingBalance{:tact}` 一起使用）。 |

## 将模式与标志(flags)相结合 {#combining-modes-with-flags}

要为 `SendParameters{:tact}` 的 `mode` 字段创建 [`Int{:tact}`][int] 值，只需通过 [bitwise OR](/zh-cn/book/operators#binary-bitwise-or) 运算将基本模式与可选标记结合起来。

例如，如果您想分别发送普通消息和支付转账费用，请使用模式 $0$（默认）和标志 $+1$，以获得 `mode` $= 1$，这等同于使用 `SendPayFwdFeesSeparately{:tact}` 常量。

或者，如果要发送全部合约余额并立即销毁，使用模式 $128$ 和标志 $+32$，得到 `mode` $= 160$，相当于 `SendRemainingBalance | SendDestroyIfZero{:tact}` 常量。

下面是后一个示例的代码：

```tact
let to: Address = address("...");
let value: Int = ton("1");
send(SendParameters {
    to: to,
    value: value,
    mode: SendRemainingBalance | SendDestroyIfZero,
    body: "Hello, World!".asComment(),
});
```

:::caution

  请注意，虽然可以将（[`+{:tact}`](/zh-cn/book/operators#binary-add)）基本模式与可选标志一起添加，但由于可能会出现多余的值，因此不鼓励这样做。  请使用位wise OR ([`|{:tact}`](/zh-cn/book/operators#binary-bitwise-or))，因为它是为处理此类标志和对 `mode` 的位操作而设计的。

:::

:::note

  还要注意的是，[基本模式](#base-modes) 只能有一种，但[可选标记](#optional-flags) 的数量可以不同：可以全部使用，也可以不使用或只使用其中一些。

:::

[int]: /zh-cn/book/integers
