精华内容
下载资源
问答
  • Tips:欢迎公众号设置为星标,VB技术干货文章可以第一时间看到。如您在学习VB过程中有独特见解或者想法...函数和过程的参数传递方式在调用过程时,过程中使用是实际参数,它要与定义过程时形式参数一一对应,...

    Tips:欢迎公众号设置为星标,VB技术干货文章可以第一时间看到。如您在学习VB过程中有独特的见解或者想法,欢迎投稿,可在公众号文章下直接留言.

    1. VB编程语言基础知识点总结

    2. VB编程基本数据类型完整剖析

    3. VB编程设计--文件同步程序的开发

    4. VB与数据库开发三步走攻略!

    函数和过程的参数传递方式

    在调用过程时,过程中使用的是实际参数,它要与定义过程时的形式参数一一对应,并以适当的形式将实参传给形参,这便是参数传递,也是虚(形参)实(实参)结合。

    VB编程中参数传递方式有两种:传值和传址。


     传值


    传值:将实参的值传给形参后,实参与形参间便无任何联系,即形参的变化不会对实参产生任何影响。传值时,在形参前用 ByVal来界定。

    例: 传值调用。

    Private Sub Command1_Click()

        Dim x as Integer,y as Integer

        x=10

        y=20

        Print ″x=″;x,″y=″;y; 

        Call temp(x,y)

        Print ″x=″;x,″y=″;y;

    End Sub

    Sub temp (ByVal x As Integer,ByVal y As Integer)

        x=x+100

        y=x*60

        Print ″x=″;x,″y=″;y;

    End Sub

    09f4d391dec1c413d013528040a60173.png


     传址


    传址(默认方式,也叫引用):形参与对应实参用相同的内存地址,形参的改变将影响实参,形参实际上是实参的别名。

    例 : 按址传递

    Private Sub Command1_Click() ‘按址传递

        x = 10

        y = 20

        Cls

        Print "x="; x, "y="; y, "调用前实参"

        Call temp1(x, y)

        Print "x="; x, "y="; y, "调用后实参"

    End Sub

    Sub temp1(x,  y) ‘按址传递

        x = x + 100

        y = x * 60

        Print "x="; x, "y="; y, "调用过程中的参数"

    End Sub

    4bda2b12c3a40e3d6cca6ff328022fb1.png

    综上,我们可以发现,同样的代码,使用不同的参数传递方式,其运行结果也不相同,大家在学习的过程中一定要深刻理解。

    51f79237fd93799aa30b7c2caf436534.png

    大家在VB学习中有任何问题

    可以添加下图老师微信号

    e2138166820e6803c1ed94bc9a967016.png

    展开全文
  • VB过程中使用参数分为实参和形参,简单讲,在过程定义中给定参数是形参,而在过程调用语句中给定参数是实参。...对参数传递方式的正确判别是过程学习中一个难点,也是等级考试中一个考点
  • 但在数据量特别大情况下,这两种方式明显就不合适宜,这意味着我们要写很多URL参数或者是Seesion变量来保存数据。但在学习《Professional ASP.NET 3.5 SP1 Edition in C# and VB过程中我发现还有一些我不...

    通常情况下,我们为了从一个页面传递某些数据到另外一个页面,总是喜欢用 URL参数或者Seesion来实现。但在数据量特别大的情况下,这两种方式明显就不合适宜,这意味着我们要写很多的URL参数或者是Seesion变量来保存数据。但在学习《Professional ASP.NET 3.5 SP1 Edition in C# and VB》的过程中我发现还有一些我不知道的其它方法可以实现。我觉的有必要与大家一起分享,与是决定写下这篇笔记。

     

    asp时代,我们经常使用跨页面传递的方式传输数据,但当我们进入到ASP.NET时代后却发现这种方式基本无法继续延续了。这不禁让我们在某些时候怀念ASP的灵活性了,不过好在ASP.NET 3.5时候,又为我们开启了这样的功能。具体是如何实现的呢?先让我们来看一个例子。

     

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Page1.aspx.cs" Inherits="WebApplicationASP.NET3._5Test.Page2" %>
    
     
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
     
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    
    <head runat="server">
    
        <title>First page</title>
    
    </head>
    
    <body>
    
        <form id="form1" runat="server">
    
        <div>
    
        you name:<asp:TextBox ID="TextBox_Name" runat="server"></asp:TextBox><br />
    
        when do you want to fly? <br />
    
            <asp:Calendar ID="Calendar1" runat="server"></asp:Calendar><br />
    
    <br />
    
    <asp:Button runat="server" ID="Button1" Text="submit page to itself" onclick="Button1_Click" />
    
        &nbsp;
    
            <asp:Button ID="Button2"  runat="server" Text="submit page to page2.aspx" PostBackUrl="~/Page2.aspx" />
    
            <br />
    
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    
            <br />
    
        </div>
    
        </form>
    
    </body>
    
    </html>

     

     

     

    在这个例子中有一个文本输入框,一个日历控件,还有一个标签控件和两处按钮。不过这都不是重点。重点是两个按钮,Button1有一个onclick事件,执行后会回传到本页面。并把用户输入的名字和选择的日期显示到LABLE1上去。具体方法如下:

    protected void Button1_Click(object sender, EventArgs e)
    
            {
    
                Label1.Text = TextBox_Name.Text + Calendar1.SelectedDate.ToString();
    
            }

     

    但另一个Button2就不一样了,它指定了一个PostBackURL,这意味着它会把数据回传到别外一个页面Page2.aspx。那Page2.aspx又是什么样子的呢?代码如下:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Page2.aspx.cs" Inherits="WebApplicationASP.NET3._5Test._Default" %>
    
     
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
     
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    
    <head runat="server">
    
        <title></title>
    
    </head>
    
    <body>
    
        <form id="form1" runat="server">
    
        <div>
    
        
    
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    
        </div>
    
        </form>
    
    </body>
    
    </html>

     

    页面文件很简单,再来看看后台代码:

     

    protected void Page_Load(object sender, EventArgs e)
    
            {   
    
                TextBox p_TextBoxName;
    
                Calendar p_Calendar;
    
     
    
                p_TextBoxName = (TextBox)PreviousPage.FindControl("TextBox_Name");
    
                p_Calendar = (Calendar)PreviousPage.FindControl("Calendar1");
    
     
    
                Label1.Text = p_TextBoxName.Text + p_Calendar.SelectedDate.ToString();
    
            }

     

    这里有稀奇了。PreviousPage,这就是我们今天的重点。Page 类下含有PreviousPage属性,它的作用是获取向当前页传输控件的页。也就是说,如果页面1向页面2传输了控件,那就可以在页面2中通过这个属性取得页面1上的所有控件。而这一切就要依赖于我们的FindControl()这个方法,FindControl()方法接受一个字符串参数,这个参数就是页面1的控件ID。看到这里,我相信大家应该已经知道怎么使用了吧。

     

    不过除了上面这种方法,还有另一种也可以实现那就是为页面设置属性。具体来看代码:

    public partial class Page1 : System.Web.UI.Page
    
        {
    
            public TextBox p_TextBoxName
    
            {
    
                get { return TextBox_Name; }
    
            }
    
            public Calendar p_Calendar
    
            {
    
                get { return Calendar1; }
    
            }
    
     }

     

     

    Page1.aspx.cs中,增加了两个页面属性。再来看看Page2.apsx,在页面顶部我们加了一个PreviousPageType 指令。指定传递过来的页面为Page1.aspx

    <%@ PreviousPageType VirtualPath="~/Page1.aspx" %>

     

    然后在后台代码中我们就可以使用智能感知写下如下代码

     Label1.Text = PreviousPage.p_TextBoxName.Text + PreviousPage.p_Calendar.SelectedDate.ToString();

     

    在这句话中大家可以发现p_TextBoxName以经做为一个属性在使用,而并没有进行其它的转换,这样是不是更方便了呢?

     

    以上就是在ASP.NET 3.5中页面传值的新方法。不过我还要额外的说一点,那就是。我们Page2.aspx除了由page1.aspx传值以外,也有可能会自己给自己传递值呀,如果这个时候去执行

    Label1.Text = PreviousPage.p_TextBoxName.Text + PreviousPage.p_Calendar.SelectedDate.ToString();

    这样的语句那一定是会报错的,怎么办呢?其实我们可以这样做:

    if (PreviousPage != null && PreviousPage.IsCrossPagePostBack)
    
                {
    
                    Label1.Text = PreviousPage.p_TextBoxName.Text + PreviousPage.p_Calendar.SelectedDate.ToString();
    
                }

     

    这里的IsCrossPagePostBack方法,就是专门用来检测,当前的回传方式是不是跨页面回传的。这样我们就不怕在跨页面回传与当前页面回传之间引起错误了。

    转载于:https://www.cnblogs.com/wugang/archive/2012/10/25/2738318.html

    展开全文
  • 按值传递(Byval)和按地址传递(ByRef)---参数传递

    千次阅读 热门讨论 2012-08-08 11:25:21
    在接触了这么多的编程语言后,似乎每个语言都要涉及到参数的传递,而参数传递过程中的两种传递方式: ①按值传递  ②按地址传递 学到现在了,仔细想想还是很模糊,从开始接触C++中的参数传递,只知道有...

    在接触了这么多的编程语言后,似乎每个语言都要涉及到参数的传递,而参数传递过程中的两种传递方式:


    按值传递  


    ②按地址传递


    学到现在了,仔细想想还是很模糊,从开始接触C++中的参数传递,只知道有这么个东西,但你要是让我说明白,有点够呛,在编程序的时候呢都是记住了一些写法才不会出错,紧接着学习C语言,Java都是如此,最近由于学习的需要,我要进行VB的一些学习,对于这个似乎忽然理解了 下面就是我自己的一些理解,在此分享一下

     

     按值传递:在过程被调用时,传递给形参的是调用过程中的相应实参的值,形参与实参各占有不同位置的储存空间,被调用过程在执行过程中,改变了形参变量的值,但不会调用过程的实参值。


    按地址传递:就是当调用一个过程时,是把实参变量的内存地址传递给被调用过程的形参,也就是说形参与实参使用相同地址的内存单元。因此当在被调用过程中改变形参的值,就等于改变了实参的值。


    PS:其实我个人认为就像两个小孩,都有自己的家,按值传递的就像是一个小孩去另一个小孩家玩,玩一段时间还是要回自己各自的家,而他们俩的家却没啥联系,一点没变,还在那呢  而按地址传递呢,就像是假如其中一个小孩的家发大水啦,然后这个小孩无家可归了,于是被另外一个小孩家收留了,这个小孩带着自己东西去那个小孩家,这时两个小孩拥有的是相同的一个家,他们俩就有联系了,因为那个小孩的家换成另外一个了.(不知道举得例子是否恰当)

    指针相信学习编程的人都知道吧,那么看看下面的例子

      按值传递时,实质上实参a只是把一个副本传递给形参x,也可以直接理解为传递的结果是让x*2中的x的值等于10(即a的值),乘以2后再赋值(赋值不用解释吧)给x,即实际上w方法的运算并没有对a本身进行操作。所以调用w方法前后a值始终等于10,而w方法得到的结果是20


    按址传递时,实质上实参a是把指针(地址)传递给形参x,这个指针指向的地址的值即是10,此时a与x分别有一个指针同时指向10所在地址,即实际上w方法对a本身直接进行了操作(a自身参与运算)。所以调用w方法前后a值分别等于10和20,而w方法得到的结果是依然是20。


     

    在比如拿VB中的例子来说

     

    按地址传递

    Functionfun(x As Integer, y As Integer) As Integer
    x = x * y
    If x<> 0 Then
    fun = x
    Else
    fun = y
    End If
    EndFunction
    Private SubCommand1_Click()
    Dim a AsInteger, b As Integer
    a = 2
     b = 3
     Text1.Text = fun(a, b)
     Text2.Text = fun(a, b)
     Text3.Text = fun(a, b)
     Text4.Text = fun(a, b)
    End Sub

    下面是运行的结果,通过结果可以看出,这个是按值传递的, 每一次运算后a的值都在变化。




    按值传递


    Subtext(ByVal x As Integer, ByVal y As Integer)
    x = x * 5
    y = y / 5
    Print"x="; x, "y= "; y
    End Sub
    Private SubCommand1_Click()
    Dim a AsInteger, b As Integer
    a = 10
    b = 90
    text a, b
    Print"a="; a, "b="; b
    End Sub

    由运行结果可以看出,尽管x,y的值经过运算后发生了变化,但是a,b的值仍然没有改变,这就是按值传递的小例子,就像上面图解的那样,传递过去的只是一个副本,而本身没有发生任何变化


    通过例子的观察和理解相信不懂参数传递的你也会和我一样理解了吧

    展开全文
  • vb6.0第五课

    2019-10-21 16:13:43
    VB传递参数两种方式:按值传递、按地址传递。其中按地址传递,又称为“引用”。 1、按值传递参数 按值传递使用Byval定义参数。使用时,程序为形参在内存中临时分配一个内存单元,并将实参传递到这个内存...

    一、参数
    1、 形参:出现在sub过程和function过程中。
    2、实参:调用参数时传递值
    在这里插入图片描述
    二、参数按值和按地址传递
    在VB中传递参数有两种方式:按值传递、按地址传递。其中按地址传递,又称为“引用”。
    1、按值传递参数
    按值传递使用Byval定义参数。使用时,程序为形参在内存中临时分配一个内存单元,并将实参的值传递到这个内存单元中。当过程中改变形参的值时,则只是改变形参内存单元中的值,实参的值不会改变。
    如:

    Private sub test( byval a as integer, byval b as  integer)
       A=a+20
       B=b+0
       Print “a=& a , “b=& b
    End sub
    
    Private sub cmdtest_click()
        Dim num1 as integer ,  num2 as integer
        Num1=10
        Num2=10
        Print “num1=& num1 , “num2=& num2
        Call test(num1,num2)
        Print “num1=& num1 , “num2=& num2
    End sub
    

    上述代码中,test过程中修改了形参a 和 b 的值,a和b是按值传递参数的,单击“cmdtest”后,形参a和b的改变没有影响实参num1和num2的取值。

    2、按地址传递参数
    按地址取值使用byref定义参数。在定义过程中,如果没有byval ,默认的是按地址传递参数。
    按地址传递参数,是指把形参变量的内存地址传递给被调用的过程。形参和实参具有相同的地址,即形参和实参共享同一段存储单元。
    Private sub test(a as integer, b as integer)
    ………. 别的都相同
    测试结果:形参a和b的改变影响了实参num1 和num2的取值。如下图所有 在这里插入图片描述
    按值传递参数、按地址传递参数应用场合,参考以下几条规则:
    (1)对于整型、长整型或单精度参数,如果不希望过程修改实参的值,则采用传值方式。而为了提高效率,字符串和数组应采用传地址方式。此外,用户定义的类型和控件只能通过地址传送。
    (2)对于其他数据类型,可以采用两种方式传送。但是建议此类参数最好用传值方式传送,这样可以避免错用参数。
    (3)用函数过程可以通过过程名返回值,但只能返回一个值;子过程不能过程过程名返回值,但可以通过参数返回值,并可以返回多个值。但需要子过程返回值时,其相应的参数要用传地址方式。

    数组参数:在定义过程中,用数组作为形参出现在过程的形参列表。语法如下:
    形能数组名() [As 数据类型]
    说明:实参列表中的数组不需要使用括号“()”,过程传递数组只能按地址传递,即形参和实参共有同一段内存单元。
    如:

    Private function average( age() as integer , n as integer )  as integer
      Dim I as integer, aver as integer, sum as integer
      For I =0  to n-1
         Sum=sum+age(i)
      Next i
      Aver=sum/n
      Average=aver
    End function
    
    Private sub command1_click()
      Dim employees()  as  integer   ‘定义一个用于存储员工年龄的数组
      Redim employees(6) 
      Employees(0)=20
      Employees(1)=28
      Employees(2)=30
      Employees(3)=24
      Employees(4)=25
      Employees(5)=35
      text1=average(employees,6)
    end sub
    

    上述数组employees作为实参传递给形参age,形参age需要改变数组的维界。因此实参employees必须用“dim employees() as integer”语句声明为动态数组。

    三、对象参数
    除了变量和数组作为实参传递给过程中的形参,VB还允许对象(如窗体、控件等)作为实参传递给过程中的形参。
    对象参数可以用引用方式,也可以用传递的方式,即在定义过程中,在对象参数的前面加byval.
    如下例为通过子过程objectena设置textbox和commandbutton控件不可用。

    Private sub objectena( obj1 as object , obj2 as object)
      obj1.enabled=false
      obj2.enabled=false
    end sub
    
    private sub form1_load()
      objectena text1,command1
    end sub
    

    四、嵌套过程

    sub mysub1()
    ...
    end sub
    
    sub mysub2()
       call mysub1
    end sub
    
    private sub form1_load()
    call mysub2
    end sub
    

    上述代码中,mysub2过程调用mysub1过程,而form1_load事件过程又调用了mysub2过程

    展开全文
  • VB中 ByRef与ByVal区别

    2019-09-22 08:53:15
    函数调用的参数传递有“值传递”和“引用传递”两种传递方式。如果采用“值传递”,在函数内部改变了参数值,主调程序对应变量值不会改变;如果采用“引用传递”,在函数内部改变了参数值,主调函数对应变量...
  • 过程是构成程序一个模块,往往用来完成一个相对独立功能。...一.Sub 过程Sub 过程的参数两种传递方式:按值传递(ByVal)和按地址传递(ByRef)。如下例:Sub password (ByVal x as integer, ByRef y as integ...
  • VB中ByVal与ByRef有什么区别 ByVal 与 ByRef(默认值)这两个是子过程的参数传递时,指定参数按什么传递的ByVal...这样过程才能拿这些数据参与计算并实现一些功能那么在传递的过程中,就存在这两种传递方式传值时(By...
  • 我们称实参 <br />在调用时,我们要将实参的值传递给形参,这样过程才能拿这些数据参与计算并实现一些功能 那么在传递的过程中,就存在这两种传递方式 传值时(ByVal),是先给形参开
  • VB课程设计俄罗斯方块

    热门讨论 2011-02-25 10:46:55
    为了怀念经典,也为了能够给大多计算机用户在工作之余找到一个休闲、娱乐一个方式,我们小组开始着手用VB语言开发一个经典俄罗斯方块游戏。 工程概况 1.1 项目名称 俄罗斯方块游戏 1.2 设计平台 VB 全称...
  • VB.Net常用语法

    2009-03-15 23:47:02
    同样有两种调用方法,如dim as as class1=new class 调用前面 一个无参数的new过程, 而dim asb as class1=new class(“string”)调用第二个new 过程. 切记,如果一个过程或一个函数只有一种状态,不能这样...
  • VB中形参声明有两种方式,一种是ByVal,一种是ByRef,如果是ByVal则在传递参数时将实参一个拷贝传递给子程序,子程序对参数的修改不会影响原有参数。如果是ByRef,则将实参指针传递给子程序,子程序对参数的修改...
  • VBS中传值与传址区别

    千次阅读 2015-10-20 10:32:48
    vb中调用函数或过程,传递参数都有两种方式——传址和传值。其中VB默认是以传址方式传递参数。 ByRef m As Integer 表示参数m以传址方式传递给函数或过程 ByVal m As Integer 表示参数m以传值方式传递给函数或...
  • byval 和byref区别,今天刚明白。

    千次阅读 2005-01-23 23:20:00
    以前看一本书上,写着VB的两种参数传递方式:byval 和byrefbyval叫做“传值”,想当于把值复制一份到新的变量中。而byref叫做传址,相当于把原变量的地址传过去。不过今天我发现,byref的传址,其实并非相当于C++中的...
  • 注意,我们演示程序中将混合使用三种方式的URL重写,因此,需要为三种实现分别设置一些URL重写规则: 1、IIRF,对于IIRF,对应于IsapiRewrite4.dll,在相同目录会有一个IsapiRewrite4.ini文件,除了默认一些...
  • 传值和传址

    2020-03-27 16:07:33
    vb中调用函数或过程时,传递参数两种方式:传址和传值。其中VB默认为传址方式,关键字ByRef一般可以省略。 ByRef a As Integer:表示参数a以传址方式传递给函数或过程 Byval a As Integer:表示参数a以传值方式...
  • 使用play方式来完成动作如下:在vb中用agent.play "xxx"的方式,js中用agent.play("xxx");的方式 Acknowledge //点头表示答谢(可用) Alert //警惕(可用) Announce //宣布(可用) Blink //眨眼睛,一般...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    18.2 在 C #代码中调用 C++和 VB 编写组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...
  • C#微软培训资料

    2014-01-22 14:10:17
    18.2 在 C #代码中调用 C++和 VB 编写组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...
  • 二、程序调用流程: 程序有两种启动方式:1 直接启动主程序,实现资料浏览、编辑功能。2 由 IE 浏览器启动,实现收集资料功能。对于后者启动流程分解如下:1、由自定义 IE 工具按钮、或者右键菜单,分别...
  • 列举ASP.NET 页面之间传递种方式。 答. 1.使用QueryString, 如....?id=1; response. Redirect().... 2.使用Session变量 3.使用Server.Transfer 3. 一列数规则如下: 1、1、2、3、5、8、13、21、34...... ...
  • 在这里我要说明两点:1、我示例文件总是有A和B分别是用C#和VB,演示图片就用C#那一种,都一样嘛,教程里面代码也是写两种用分割开,大家可以比较一下。2、我写教程时候用都是记事本来编写APS.NET大家...
  • 在一小时内学会 C#(txt版本)

    热门讨论 2009-08-19 18:09:37
    两种数据类型: 1. 基本/内建类型 2. 用户定义类型 以下是 C# 内建类型列表: 类型 字节 描述 byte 1 unsigned byte sbyte 1 signed byte short 2 signed short ushort 2 unsigned short int 4 signed ...
  • c#学习笔记.txt

    2008-12-15 14:01:21
    换言之,基接口集是显式基接口、它们的显式基接口(依此类推)的完全可传递的闭包。接口继承其基接口的所有成员。接口成员是通过 I.M 和 I[A] 形式的成员访问和索引访问表达式访问的,其中 I 是接口类型的实例,M 是...
  • 这里的IDE设备包括了IDE硬盘和IDE光驱,第一、第二组设备是指主板上的第一、第二根IDE数据线,一般来说靠近芯片的是第一组IDE设备,而主设备、从设备是指在一条IDE数据线上接的两个设备,大家知道每根数据线上可以接...
  • rar压缩软件.rar

    2016-02-13 10:52:44
    包含个掩码,并且所有文件既匹配第一个掩码,也匹配第二个掩码, 较小子集 或者更精确匹配拥有更高优先权。例如,如果你用 *.cpp 和 f*.cpp 掩码, f*.cpp 拥有更高优先权。 RAR 命令行语法 ~~~~~~...
  • 自动打印机

    2012-01-03 14:03:02
    (3)带传动:这种传动机构是靠带拥护带轮之间的摩擦力来传动的,它的主要优点是机构简单,传动平稳,造价低廉以及缓冲吸震等,可用于传递距离较远的两轴间的运动,且与摩擦轮转动一样也有过载保安性。但是由于不能...
  •  支持静态链接其它编程语言(如C/C++、汇编等)编译生成静态库(.LIB或.OBJ),但仅限于COFF格式,支持cdecl和stdcall两种函数调用约定。  使用说明如下:函数声明和调用方法与DLL命令一致;“库文件名”以.lib...

空空如也

空空如也

1 2
收藏数 40
精华内容 16
关键字:

vb参数传递的两种方式